拷⻉⼤切⽚⼀定⽐⼩切⽚代价⼤吗

代价是一样的,当把一个 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
Copyright © CoffeeChat 2020 all right reserved,powered by Gitbook该文件修订时间: 2023-05-31 16:34:35

results matching ""

    No results matching ""