• 数组

    1.数组的长度需要声明
    2.存储的数据类型必须一致
    3.可以通过下标来访问,超出长度问报访问越界的错误
    4.不支持负数索引
    5.数组是值类型,传递的都是拷贝,不会对原来的对象进行修改
    6.Go中不存在深拷贝和浅拷贝,都是值传递
    
    • 初始化数组
      a1 := [3] {"mkl", "klm", "lkm"}
      a2 := [...] {"mkl", "klm", "lkm"}
      
    • 多维数组初始化
      // 内部的数组元素不可以使用...来声明数量 
      // 另起一行花括号需要加逗号 不换行可以不加
      a := [...][2] string {
        {"a", "b"},
        {"a", "b"},
        {"a", "b"},
      }
      
  • 切片

    1.基于数组,自动扩容,更换数组
    2.结构包含:地址、长度、容量
    3.切片不支持直接比较,只能和nil进行比较
    4.cap()获取容量(底层数组能存储的容量),len()获取长度
      理解方式:切片代表一个公司,数组代表办公地点,公司人员扩充,办公地点更变,
      换一个工作多的办公地点。扩容必定换了内存地址。
    5.字符串也支持切片表达式
    6.*对切片再进行切片,切片的上限为容量,而不是长度
    7.完整切片表达式[low:high:max]
    8.make函数初始化,一旦申请内存空间,就不等于nil,最好一次性将内存申请到位,避免运行时扩充消耗
    9.判断切片是否为空 len(s) == 0 而不是与nil比较,nil切片没有底层数组
    
    • 初始化切片

      var s1 []int // 切片声明
      s2 := [5]int {1,2,3,4,5}  
      s3 := s2[1:3] // 切片表达式,基于数组s2按索引去取,左包含,右不包含
      

      切片再切片

      a := [3]int{1, 2, 3}
      b := a[0:2]
      c := b[1:3]
      fmt.Println(a)
      fmt.Println(b)
      fmt.Println(c)
      // [1 2 3]
      // [1 2]
      // [2 3]
      // 修改底层数组
      a[1] = 100
      fmt.Println(a)
      fmt.Println(b)
      fmt.Println(c)
      // [1 100 3]
      // [1 100]
      // [100 3]
      

      切片完整表达式

      // 默认切片的容量是切片的开始索引到数组的最后
      // 0 <= low < high <= max
      // max 指的是high能取到的最大值 影响切片的容量
      // 最终切片的容量是max-low
      a := []int {1,2,3,4,5}
      s1 := a[1:2:3]
      fmt.Println(s1, len(s1), cap(s1))
      

      make()初始化 申请内存空间

      // 容量可以省略
      a := make([]int, 2, 10) // make([]T, size, cap)
      

      字面量初始化

      s := []int{1,2,3}
      
    • 切片的拷贝

      a := []int {1,2,3}
      b := make([]int, len(a))
      copy(b, a) // 将切片a中的值拷贝到切片b中,必须声明b的长度,不然无法装载被拷贝对象a的元素
      
    • 切片的遍历与append

      // 索引遍历
      s := []int {1,2,3,4}
      for i:= 0; i< len(s); i++ {
        fmt.Println(i)
      }
      // range遍历
      for i, v := range(s) [
        fmt.Println(i)
      ]
      

      append()添加元素

      // append() 必须接受返回值
      // append()函数可能触发切片的扩容,如果不接收返回值,那么操作之后的切片对象还是原来的切片地址
      // 添加单个元素
      s := []string
      s := append(s, "d")
      // 添加一个切片中所有元素
      s1 := []string{"a", "b"}
      s2 := append(s, s1...)
      
    • 切片删除元素

      // 通过切片拼接的方式,实现根据下标删除元素的的效果
      var s = []int {1,2,3}
      s = append(s[:1], s[2:]...)
      
  • map

    无序的key,value结构

    • 初始化map
      m := make(map[string]int, 10) // 可以声明容量,减少动态扩容
      // 字面量初始化
      m := map[string]string{
        "username": "mkl"
        "password": "123"
      }
      
    • 取值
      v, ok := m["username"]
      
    • 遍历
      for k, v := range m {
        Println(k, v)
      }
      
    • 删除

      delete() 删除键值对,没有返回值

      delete(m, "username")
      
posted on 2022-09-14 10:02  _tiny_coder  阅读(28)  评论(0编辑  收藏  举报