# GO 中常用容器

# 1. 数组

// 申明时需要固定大小 var name [size] T
var classMates [3]string
classMates[0] = "小明"
classMates[1] = "小红"
classMates[2] = "小李"
classMates2 := [...]string{"小明","小红","小李"}  // 使用初始化列表初始化数组
classMates3 = new([3]string)  
classMates3[0] = "小明" // 可使用指针操作数组
classMates3[1] = "小红"
classMates3[2] = "小李"
fmt.Prinrln(*classMates) // [小明 小红 小李]

# 2. 切片

可以理解为动态数组,切片的结构体由依稀 3 部分组成

  • array 是指向底层存储数据数组的指针
  • len 指当前切片的长度,即成员数量
  • cap 指当前切片的容量,它总是 >= len
source := [3]int{1,2,3}
sli := source[0:1] // [1] 从数组下标 0 位置开始,下标 1 位置结束,不包含小标 1 的元素
len(sli)  // 长度为 1
cap(sli) // 容量为 3
sli[0] = 4 // 切片为原数组的引用  修改切片值即修改数组的值
fmt.Println(source)  // [4 2 3]
// 动态创建切片 make ([] T, size, cap)
slice := make([]int,2,4) // [0 0]  会被初始化为类型初始值 这里是 int 类型即为 0
// 申明新的切片 区别于数组不需要指定长度
ex := []int{1,2,3}
len(ex) // 3
cap(ex) // 3 大小和容量都为 3

动态扩容 append

// 使用 append 内建函数向切片中添加元素  返回新切片  地址发生了改变
arr1 := [...]{1,2,3,4}
arr2 := [...]{1,2,3,4}
arr3 := [...]{1,2,3,4}
sli1 := arr1[0:2]  //len 为 2 cap 为 4
sli2 := arr2[2:4]  //len 为 2 cap 为 2 切片范围超出了原数组的下标范围  创建了新的数组并指向了它
sli3 := arr3[0:2:2] //len 为 2 cap 为 2    arr [start,end,cap] 这里指定了 cap 为 2  
newSli1 := append(sli1, 5) // [1 2 5] len 小于 cap  原数组值被覆盖为 [1 2 5 4]
newSli2 := append(sli2, 5) // [3 4 5] 超出容量 申请了新的数组底层 
newSli3 := append(sli3, 5) // [1 2 5] 超出容量 申请了新的数组底层

复制切片 copy

copy(destSli,srcSli []T)   // 长度取决于目标切边长度 destSli
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

PPYYLEE 微信支付

微信支付

PPYYLEE 支付宝

支付宝

PPYYLEE 贝宝

贝宝