数组
- 数组是值类型,如果你将一个数组赋值给另外一个数组,那么,实际上就是将整个数组拷贝一份
- 如果数组作为函数的参数,那么实际传递的参数是一份数组的拷贝,而不是数组的指针
- array的长度也是Type的一部分,这样就说明[10]int和[20]int是不一样的。
- 初始化数组需要指定大小,不指定也会根据初始化数据自动推算出大小,不可改变
切片
- 切片可以改变长度,在自动扩容时,在数组容量小于1024个元素时,每次扩容的数组容量是原来数组的2倍。当数组容量大于1024个元素时,每次扩容的数组容量变为原来数组的1.25倍
- 切片是轻量级的数据结构,三个属性,指针,长度,容量
- 初始化可以不指定长度,也可以指定长度和容量 避免频繁自动扩容
- 切片是指针传递,因此切片作为参数传入函数后。在函数内部修改切片时,如果触发动态扩容 切片地址会发生改变。所以外部切片和内部切片不再是同一个切片。如果没有,外部切片和内部切片还是同一个
append
append 会返回切片内存地址,如果发生扩容返回的地址会发生变化。否则不变
如果切片 s长度为3,容量为4。这个时候 分别声明两个变量 x,y 等于 append(s, x1 | y1) 最终x和y以及s的内存地址是一样的。只是长度不同 x和y的长度为4
func main() {
s := []int{5} // len=1 cap = 1
s = append(s, 7) // len=2 cap=1*2=2
s = append(s, 9) // len=3 cap = 2*2=4
x := append(s, 11)
y := append(s, 12)
fmt.Printf("%p,%p,%p\n",s, x, y)
fmt.Println(s, x, y)
}
/*
* 0xc000014080,0xc000014080,0xc000014080
* [5 7 9] [5 7 9 12] [5 7 9 12]
*/
因为 在 s = append(s, 9) // len=3 cap = 2*2=4 这个时候s的实际数组长度为4,所以下面x=append(s, 11)时,切片认为s的容量够用所以在s后面追加了11并修改内存数据,并使用了相同的内存地址 只是长度记录为4. x=append(s, 12)时,切片认为s的容量够用所以在s后面追加了12 并修改内存数据 这个时候的修改会覆盖刚刚的11 所以最终 x和y内存地址和数据完全一样
网友评论