Golang基础——数据类型:切片
切片:
大小不确定的放在堆区(实际值),固定长度的在栈区(变量名:存地址)
添加切片数据的时候,地址可能发生改变,当前内存不能连续并且足够大。
扩容:<=1024 :两倍;> 1024 :每次扩容上一次的 1 / 4
引用传递
var a []int
a = append(a, 1, 2, 3, 4, 5)
fmt.Println(a)
fmt.Printf("%T\n", a)
fmt.Println(len(a)) // 长度
fmt.Println(cap(a)) // 容量
var b = []int{1, 2, 3}
fmt.Println(b)
c := []int{1, 2, 3}
fmt.Println(c)
d := make([]int, 5, 10) // 长度 5,容量 10
fmt.Println(d)
fmt.Println(len(d))
fmt.Println(cap(d))
e := make([]int, 3)
fmt.Println(e)
e[0] = 111
fmt.Println(e)
切片截取固定长度:
s := []int{1,2,3,4,5}
s[0:3:5] // 从0到3,取左不取右,s的容量为 5,容量不能超过原来的切片的容量
// 地址和原来的切片重合,是原来切片的一部分,还是原来的地址。所以修改切片的内容,会影响原来的。
切片拷贝:
a := []int{1, 25, 5} // [1 25 5]
var c []int
b := make([]int, 1)
copy(b, a) // 存储两个地址 a -> b
copy(c, a)
fmt.Println(a)
fmt.Println(b) // 有几位填充几位 [1]
fmt.Println(c) // []
切片当做函数参数,引用传递:
但是,append函数,向切片中添加数据时,地址将可能发生改变,不影响实参的地址。相当于,如果内存够用,就用原来的;不够用了,就新开辟内存地址。但是原来的实参切片还在原来的地址。