)
fmt.Println("Array", s1)
运行结果
len:5 cap: 5 array ptr: 0xc820012210
Array: [1 2 3 4 5]
len:2 cap: 4 array ptr: 0xc820012218
Array [2 3]
在一个切片基础上创建新的切片 s1 ,新切片的 ptr 指向的就是 s1[0] 数据的内存地址。可以看到指针地址 0xc820012210 与 0xc820012218 相差 8byte 正好是一个int类型长度,cap也相应的变为4
就写到这里了,总结一下,切片的结构是指向数据的指针,长度和容量。复制切片,或者在切片上创建新切片,切片中的指针都指向相同的数据内存区域。
知道了切片原理就可以在开发中避免出现错误了,希望这篇博客可以给大家带来帮助。
参考:https://blog.golang.org/go-slices-usage-and-internals
附上 go 源码中 slice 的数据结构定义
type slice struct {
array unsafe.Pointer
len int
cap int
}