拷⻉⼤切⽚⼀定⽐⼩切⽚代价⼤吗
代价是一样的,当把一个 slice 变量复制给另外一个变量时,只需要拷贝一个底层数组的指针和2个int值(长度和容量),所以拷贝的代价和底层数组大小无关,这也就是所谓的浅拷贝。
go源码中切片的定义如下(runtime/slice.go):
type slice struct {
array unsafe.Pointer
len int
cap int
}
默认是不导出的,如果我们要访问一个 slice 底层的这些结构,我们可以使用 reflect
包下的 SliceHeader
结构。
package reflect
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
测试:
func main() {
var s1 = []int{1, 2, 3}
s2 := (*reflect.SliceHeader)(unsafe.Pointer(&s1))
fmt.Printf("%v\n底层数组地址: %d, Len: %d, Cap: %d", s2, s2.Data, s2.Len, s2.Cap)
}
输出:
&{824633876744 3 3}
底层数组地址: 824633876744, Len: 3, Cap: 3