Go 基础语法02 | 青训营笔记

55 阅读3分钟

Go 基础语法01 | 青训营笔记 - 掘金 (juejin.cn)

6 数组

数组:具有编号和固定长度的元素序列

func main(){
      var a[5]int
      a[4] = 100
      fmt.Println(a[4],len(a))
  ​
      b := [5]int{1,2,3,4,5}
      fmt.Println(b)
  ​
      var twoD [2][3]int
      for i:=0;i<2;i++{
          for j:=0;j<3;j++{
              twoD[i][j]=i+j
          }
      }
      fmt.Println("2d: ",twoD)
  }
  ​
  // 100 5
  // [1 2 3 4 5]
  // 2d:  [[0 1 2] [1 2 3]]

7 切片slice

切片可以任意更改长度

  1. slice 使用make创建
  2. slice 可以使用append 追加元素(需要把append结果赋值给原数组)
  3. slice 初始化时有一定长度,在后续操作中会自动扩容
  4. slice 可以和python一样进行切片操作,但不支持负数索引
  func main(){
      s := make([]string,3)
      s[0] = "a"
      s[1] = "b"
      s[2] = "c"
      fmt.Println("get:",s[2]) // get: c
      fmt.Println("len:",len(s)) // len: 3
  ​
      s = append(s, "d")
      s = append(s, "e", "f")
      fmt.Println(s) // [a b c d e f]
  ​
      c := make([]string,len(s))
      copy(c,s)
      fmt.Println(c) // [a b c d e f]
  ​
      fmt.Println(s[2:5]) // [c d e]
      fmt.Println(s[:5]) // [a b c d e]
      fmt.Println(s[2:]) // [c d e f]
  ​
      good := []string{"g","o","o","d"}
      fmt.Println(good) // [g o o d]
  }

8 map

  1. 使用make创建空map
  2. 可以存储或取出键值对
  3. 可以使用delete删除键值对
  4. golang的map是完全无序的,遍历的时候为随机顺序
  func main(){
      m := make(map[string]int)
      m["one"] = 1
      m["two"] = 2
      fmt.Println(m) // map[one:1 two:2]
      fmt.Println(len(m)) // 2
      fmt.Println(m["one"]) // 1
      fmt.Println(m["unknow"]) // 0
  ​
      r,ok := m["unknow"]
      fmt.Println(r,ok) // 0 falsedelete(m,"one")
  ​
      m2 := map[string]int{"one":1,"two":2}
      var m3 = map[string]int{"one":1,"two":2}
      fmt.Println(m2,m3) // map[one:1 two:2] map[one:1 two:2]
  }

9 range

用于对slice或map进行遍历

range进行遍历时,数组会返回两个值:索引、值,如果不需要可以使用"_"占位

  func main(){
      nums := []int{2,3,4}
      sum := 0
      for i,num := range nums{
          sum += num
          if num == 2{
              fmt.Println("index",i,"  ","num:",num) // index 0    num: 2
          }
      }
      fmt.Println(sum) // 9
  ​
      m := map[string]string{"a":"A","b":"B"}
      for k,v := range m{
          fmt.Println(k,v)
          // a A
          // b B
      }
      for k := range m{
          fmt.Println("key",k)
          // key b
          // key a
      }
  }

10 函数——实现两变量相加

Golang的变量类型是后置的

Golang的函数支持返回多个值

​ 实际业务中大都返回两个值:第一个值是真正的返回结果,第二个值是一个错误消息

  func add(a int,b int)int{
      return a+b
  }
  ​
  func add2(a,b int)int{
      return a+b
  }
  ​
  func exists(m map[string]string,k string)(v string,ok bool){
      v,ok = m[k]
      return v,ok
  }
  ​
  func main(){
      res := add(1,2)
      fmt.Println(res) // 3
  ​
      v,ok := exists(map[string]string{"a":"A"},"a")
      fmt.Println(v,ok) // A true
  }

11 指针——数加2

使用:对传入参数进行修改

  func add2(n int){
      n += 2
  }
  ​
  func add2ptr(n *int){
      *n += 2
  }
  ​
  func main(){
      n := 5
      add2(n)
      fmt.Println(n) // 5
      add2ptr(&n)
      fmt.Println(n) // 7
  }

12 结构体

结构体:带类型的字段的集合

  type user struct{
      name string
      password string
  }
  ​
  func main(){
      a := user{name: "Tom", password: "0001"}
      b := user{name: "Jack", password: "0002"}
      c := user{name: "Mary"}
      c.password = "0003"
      var d user
      d.name = "John"
      d.password = "0004" 
  ​
      fmt.Println(a,b,c,d) // {Tom 0001} {Jack 0002} {Mary 0003} {John 0004}
      fmt.Println(checkPassword(a,"haha")) // false
      fmt.Println(checkPassword2(&a,"haha")) // false
  }
  ​
  ​
  func checkPassword(u user,password string)bool{
      return u.password == password
  }
  ​
  // 支持指针:可实现对结构体的修改;避免大结构体的拷贝开销
  func checkPassword2(u *user,password string)bool{
      return u.password == password
  }
  ​

13 结构体方法

Golang 可以为结构体定义方法

将普通函数改成结构体方法,可以使用a.checkPassword("1111")调用

修改方法:

​ 将第一个参数加括号写到函数名称前面

实现结构体的方法:

  1. 带指针:可以对结构体进行修改
  2. 不带指针:只是进行拷贝,不能对结构体进行修改
  type user struct{
      name string
      password string
  }
  ​
  func (u user)checkPassword(password string)bool{
      return u.password == password
  }
  ​
  func (u *user)resetPassword(password string){
      u.password = password
  }
  ​
  func main(){
      a := user{name: "Tom", password: "0001"}
      a.resetPassword("1111")
      fmt.Println(a) // {Tom 1111}
      fmt.Println(a.checkPassword("1111")) // true
  }