golang学习之slice
1.slice本质
pointer + len + cap
pointer 指向一段真实数组
len 从起始地址指向元素开始的数量
cap 此数组的容量(append时,容量不够会自动扩容)
2.slice的有趣实验
1 func main() { 2 var array []int32 = []int32{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 3 var slice = array[0:10] 4 fmt.Println("原始array[0]:", array[0]) 5 slice[0] = 2 6 fmt.Println("新的array[0]:", array[0]) 7 slice = append(slice, 11) 8 //fmt.Println("新的array[10]:", array[10]) 9 slice[0] = 3 10 fmt.Println("新的array[0]:", array[0]) 11 fmt.Println("新的slice[0]:", slice[0]) 12 }
输出结果:
前两个输出,修改slice的值,原始的也被修改,表明slice的本质是一个指针
后两个输出,修改slice的值,原始的没有再被修改,因为slice的cap不够,会自动扩容(实验尝试发现扩容一般为原cap的两倍,且是4的倍数)
扩容后slice是一个新的地址,跟原来的就不相关了。