笔记标题 | 青训营笔记

131 阅读3分钟

一、GO语言的特点

1、语法简洁;Go语言简单易学,学习曲线平缓。

2、代码风格统一。

3、执行性能好

4、开发效率高

5、支持并发。

二、helloworld

 //注意这里是main包,不论放在哪个目录下,都是main,才能被直接运行main方法
 package main 
 //包导入
 import "fmt"
 //定义main方法
 func main() {
     fmt.Println("hello,world!")
 }

三、基础语法

注意:在申明变量之后或者赋值之后,需要使用到变量,否则会报错。

1、常见变量
 package main
 ​
 import "fmt"
 ​
 func main() {
     
     //int变量有很多中,需要区分他们的范围
     //int int8/int16/int32/int64
     var a int
     a = 1
     print(a)
     
     //float32 float64
     var f float32
     f = 123.1
     print(f)
     
     //空值nil
     
     //字符串类型
     var str string
     str = "hello "
     //可以直接拼接
     str = str + "world"
     fmt.Println(str)
     
     
 }
2、变量的声明方式
     //声明方式1  var 变量名
     var a int
     a = 1
     print(a)
 ​
     //声明方式2 变量名 := 赋值
     b := 1
     print(b)
3、if-else
 //if-else
     a := 10
     //这里的判断不需要加上(),当然加上也不会有错
     if a < 10 {
         fmt.Println("a小于10")
     } else if a > 10 {
         fmt.Println("a大于10")
     } else{
         fmt.Println("啊等于10")
     }
     
     //if语句可以使用定义临时变量,使用分割符号进行
     if b := 10; b > 10 {
         fmt.Println("b小于10")
     } else if c := 10;b > 10 && c > 10 {
         fmt.Println("a大于10,c也大于10")
     } else{
         fmt.Println("啊等于10")
     }
4、for循环
1)第一种for,死循环
 package main
 ​
 func main() {
 ​
     //for循环
 ​
     cnt := 0
     //当计数器为10,退出循环
     for {
         if (cnt == 10) {
             break
         }
         cnt++
     }
 ​
 }
2)for-range(遍历数组或者map等结构)
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     var arr [3]int
     arr[0] = 1
     arr[1] = 2
     arr[2] = 3
     //index为数组的下标,value为数组的下标对应的值
     for index, value := range arr {
         fmt.Println(index, "---", value)
     }
 }
 ​
3 ) fori
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     for i := 0; i < 10; i++ {
         fmt.Println(i)
     }
     
 }
4、switch分支结构
 package main
 ​
 func main() {
 ​
     i := 3
 ​
     //不需要break
     switch i {
     case 1:
         print("one")
     case 2:
         print("two")
     case 3, 4:
         print("three four")
     default:
         print("other")
 ​
     }
 ​
 }
 ​
5、数组以及声明
 var arr [3]int
     arr[0] = 1
     arr[1] = 5
     arr[2] = 10
     print(arr)
6、切片(可变长度)
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     var slice1 = make([]int, 3)
     slice1[0] = 1
     slice1[1] = 1
     slice1[2] = 1
     fmt.Println(slice1)
     fmt.Println(len(slice1)) //3
 ​
     //需要重新赋值给切片,因为append不会修改传入的切片
     slice1 = append(slice1, 10)
     fmt.Println(slice1)
     fmt.Println(len(slice1)) //4
 ​
     //slice[start:end],取出下标为start到end-1的元素
     fmt.Println(slice1[2:4]) //1 10
     //slice[:end] 0-end-1
     fmt.Println(slice1[:4]) //1 1 1 10
     //slice[start:] start到len(slice) - 1
     fmt.Println(slice1[1:4]) //1 1 10
     //slice[:]
     fmt.Println(slice1[:]) //1 1 1 10
 ​
 }
 ​
7、map哈希
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     //map[key类型]value类型,key是唯一的
     map1 := make(map[string]int)
     map1["a"] = 1
     map1["b"] = 1
     fmt.Println(map1) //map[a:1 b:1]
     //覆盖
     map1["a"] = 2
     fmt.Println(map1) //map[a:2 b:1]
     //根据key获取value
     const key1 = "a"
     fmt.Println(map1[key1])
     //遍历map
     for key, value := range map1 {
         fmt.Println(key, "---", value)
     }
     const key2 = "b"
     //删除key
     delete(map1, key2)
     fmt.Println(map1)
 ​
 }
 ​
8、函数
1)无参无返回值
 func f1() {
     fmt.Println("无参无返回值")
 }
2)有参无返回值
 // func 函数名(形参名 形参类型) {
 // }
 func f2(name string) {
     fmt.Println("有参无返回值", name)
 }
 ​
3)有参有一个返回值
 // func 函数名(形参名 形参类型,...) (返回值名 返回值类型) {}
 func f3(a int, b int) (c int) {
     return a + b
 }
4)有参有两个返回值
 // func 函数名(形参名 形参类型,...) (返回值名 返回值类型) {}
 func f4(a int, b int) (c int, d int) {
     //使用逗号分割
     return a + b, a * b
 }

5)声明了函数返回值还可以这样用

 func main() {
 ​
     fmt.Println(f1(10)) //10 + 1 + 2
 ​
 }
 ​
 func f1(add int) (result int) {
     result = 1
     return 2 + result + add
 }
函数调用
     f1()
     f2("zs")
     add := f3(10, 20)
     fmt.Println(add)
     add1, mul := f4(10, 20)
     fmt.Println(add1,"-",mul)
9、指针
 package main
 ​
 import "fmt"
 ​
 func main() {
 ​
     //1.定义指针
     var prev *int
     a := 10
     prev = &a          //此时prev指向a对应的地址
     fmt.Println(prev)  //打印的是地址
     fmt.Println(*prev) //取值 *prev = 10
     
     //2.函数传入的指针和不传入指针
     f2(a)
     fmt.Println(a)//10
     f1(prev)
     fmt.Println(*prev)//11
 ​
 }
 func f1(a *int)  {
     *a ++
 }
 ​
 func f2(a int)  {
     a ++
 }
 ​
10、结构体

1)调用定义

 package main
 ​
 import "fmt"
 ​
 type people struct {
     name string
     age  int
 }
 ​
 func main() {
 ​
     //1.创建一个结构体对象
     p1 := people{name: "zs", age: 10}
     fmt.Println(p1)
     p2 := people{name: "ls"}
     //使用对象.属性名,进行调用赋值
     p2.age = 10
     fmt.Println(p2)
 ​
 }
 ​

2)结构体方法以及调用

 package main
 ​
 import "fmt"
 ​
 type people struct {
     name string
     age  int
 }
 ​
 func main() {
 ​
     //1.创建一个结构体对象
     p1 := people{name: "zs", age: 10}
     fmt.Println(p1)
     
     fmt.Println(p1.getName())
 ​
     p1.setName("张三")
     fmt.Println(p1.getName())
 ​
 }
 ​
 func (p people) getName() (name string) {
     return p.name
 }
 ​
 //使用指针可以修改结构体对象的属性
 func (p *people) setName(name string) () {
     p.name = name
 }
 ​
11、错误处理
 func main() {
 ​
     //调用并且捕获异常
     err := errorTest(10, 20)
     if err != nil {
         fmt.Println("出现错误原因", err)
         panic(err)
     }
 }
 ​
 func errorTest(a int, b int) (err error) {
     if a+b > 10 {
         return errors.New("a + b不能大于10")
     }
     return nil
 }
12、字符串操作API

基本都在strings工具类下面

 func main() {
 ​
     a := "hello"
     //查看是否包含一个字符串
     fmt.Println(strings.Contains(a, "ll"))
     //统计出现字符串的个数
     fmt.Println(strings.Count(a, "l"))
     //比较字符串,与其他语言类似
     fmt.Println(strings.Compare(a, "hell"))
     //判断前缀
     fmt.Println(strings.HasPrefix(a, "he"))
     //判断后缀
     fmt.Println(strings.HasPrefix(a, "llo"))
 ​
 }
13、字符串格式化
 package main
 ​
 import (
     "errors"
     "fmt"
 )
 ​
 type people struct {
     name string
     age  int
 }
 ​
 func main() {
 ​
     str := "str1"
     a := 123
     p := people{"zkx", 18}
 ​
     fmt.Printf("%v\n", str) //str
     fmt.Printf("%v\n", a) //正常打印
     fmt.Printf("%v\n", p) //正常打印
     fmt.Printf("%+v\n", p) //打印出属性名:属性值
     fmt.Printf("%#v\n", p) //打印出包名+属性名:属性值
 ​
     f := 123.3455
     //保留2位小数,会进行四舍五入
     fmt.Printf("%.2f\n", f)
 ​
 }
 ​
14、JSON处理
 package main
 ​
 import (
     "encoding/json"
     "fmt"
 )
 ​
 type people struct {
     Name string `json:name`
     Age  int    `json:age`
 }
 ​
 func main() {
     //JSON序列化需要属性名大写,使用`json:指定名称`修改序列化的名称
     p := people{"zkx", 18}
     marshal, err := json.Marshal(p)
     if err != nil {
         panic(err)
     }
     fmt.Println(marshal)
     fmt.Println(string(marshal))
 ​
     //自定义格式
     indent, err := json.MarshalIndent(p, "", "\t")
     if err != nil {
         panic(err)
     }
     fmt.Println(string(indent))
 ​
     //反序列化
     var p2 people
     err = json.Unmarshal(marshal, &p2)
     if err != nil {
         panic(err)
     }
     fmt.Printf("%v\n", p2)
 ​
 }
 ​
15、数字解析
 package main
 ​
 import (
     "fmt"
     "strconv"
 )
 ​
 func main() {
     float, _ := strconv.ParseFloat("12.3", 64)
     fmt.Println(float)
 ​
     n, _ := strconv.ParseInt("123", 10, 64)
     fmt.Println(n)
 ​
     n1, _ := strconv.ParseInt("0x1000", 0, 64)
     fmt.Println(n1)
 ​
     atoi, err := strconv.Atoi("AAA")
     fmt.Println(atoi, err)
 }
 ​