数组
定义数组
var intArr [3]int32
int型数组的默认值为0
数组的初始化
var intArr [3]int = [3]int{1,2,3}
var intArr = [3]int{1,2,3}
var intArr = [...]int{1,2,3}
var intArr = [...]int{1:100, 0:0, 2:200}
//类型推导
strArr := [...]string{0:"tom", 1:"jack", 2:"white"}
数组的访问
普通遍历方式
var intArr [3]int = [3]int{22, 23, 24}
for i := 0; i < 3; i++ {
fmt.Println("i: ", i, " value: ", intArr[i])
}
for range
var intArr [3]int = [3]int{22, 23, 24}
for index, v := range intArr {
fmt.Println("index: ", index, " value: ", v)
}
切片(slice)
切片是引用类型,是数组的一个引用。切片是一个可以动态变化的数组,其长度是可以变化的。 slice从底层来说就是一个数据结构
type slice struct {
ptr *[2]int
len int
cap int
}
定义切片
方式一:定义一个切片,然后让切片去引用一个创建好的数组
var intArr [5]int = [...]int{1, 2, 3, 4, 5}
var slice = intArr[1:3]
fmt.Println("arr =", intArr)
fmt.Println("slice =", slice)
fmt.Println("slice len = ", len(slice))
fmt.Println("slice cap = ", cap(slice)) //切片的容量是可以动态变化的
可以看出切片里面的范围是左闭右开
方式二:通过make来创建切片
var 切片名 []type = make([]type, len, cap) // cap指定切片容量,可选
//如果分配了cap,必须cap>=len
var slice []int32 = make([]int32, 5, 10)
append()函数
var a []int
a = append(a, 1) // 追加1个元素
a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
a = append(a, []int{1,2,3}...) // 追加一个切片, 切片需要解包
不过需要注意的是,在使用 append() 函数为切片动态添加元素时,如果空间不足以容纳足够多的元素,切片就会进行“扩容”,此时新切片的长度会发生改变
除了在切片的尾部追加,我们还可以在切片的开头添加元素:
var a = []int{1,2,3}
a = append([]int{0}, a...) // 在开头添加1个元素
a = append([]int{-3,-2,-1}, a...) // 在开头添加1个切片
将另一个切片的部分数据在切片的尾部追加
var a = []int{1,2,3}
var b = []int{1,2,3,4,5,6}
a = append(a, b[3:]...) //将b后面的456解包后追加到a中
// 没有append(b[3:]..., a)的写法
// Cannot use 'b[3:]' (type []int) as the type []Type
copy():切片复制(切片拷贝)
如果加入的两个数组切片不一样大,就会按照其中较小的那个数组切片的元素个数进行复制。
copy( destSlice, srcSlice []T) int
其中 srcSlice 为数据来源切片,destSlice 为复制的目标(也就是将 srcSlice 复制到 destSlice),目标切片必须分配过空间且足够承载复制的元素个数,并且来源和目标的类型必须一致,copy() 函数的返回值表示实际发生复制的元素个数。
slice1 := []int{1, 2, 3, 4, 5}
slice2 := []int{5, 4, 3}
copy(slice2, slice1) // 只会复制slice1的前3个元素到slice2中
copy(slice1, slice2) // 只会复制slice2的3个元素到slice1的前3个位置