为了账号安全,请及时绑定邮箱和手机立即绑定

底层数组在 Golang 的“切片”中的行为

底层数组在 Golang 的“切片”中的行为

Go
月关宝盒 2022-08-30 15:04:11
我对切片中的数组感到非常困惑。代码发布在下面。我理解 test() 从 main() 获取 arr 的副本,而 test() 中的 'append' 不会分配新数组,因为 cap > len。但是,测试切片 arr[] 和主切片 arr[] 中的基础数组似乎不同,因为它们的地址不同。另一方面,test() 中的 'append' 操作确实修改了 main() 中的基础数组,因为当打印主切片的基础数组时,会出现一个新的 '1'。此外,test() 能够设置 arr[0] = 10,这在 main() 中是可见的。这是如何发生的?切片中数组的地址取自这篇文章。func test(arr []int) {    arr[0] = 10    fmt.Printf("test slice - %p \n", &arr) //    hdr := (*reflect.SliceHeader)(unsafe.Pointer(&arr))    data := *(*[10]int)(unsafe.Pointer(hdr.Data))    fmt.Printf("test - %p \n", &data)    arr = append(arr, 1)    fmt.Printf("test slice = %p \n", &arr) //    hdr = (*reflect.SliceHeader)(unsafe.Pointer(&arr))    data = *(*[10]int)(unsafe.Pointer(hdr.Data))    fmt.Printf("test = %p \n", &data)}func main() {    var arr []int = make([]int, 4, 10)    hdr := (*reflect.SliceHeader)(unsafe.Pointer(&arr))    data := *(*[10]int)(unsafe.Pointer(hdr.Data))    fmt.Printf("main - %p \n", &data)    test(arr)    hdr = (*reflect.SliceHeader)(unsafe.Pointer(&arr))    data = *(*[10]int)(unsafe.Pointer(hdr.Data))    fmt.Printf("main = %p \n", &data)    fmt.Println("main data ", data)}输出:main - 0xc00009e050 test slice - 0xc0000a6000 test - 0xc00009e0a0 test slice = 0xc0000a6000 test = 0xc00009e0a0 main = 0xc00009e050 main data  [10 0 0 0 1 0 0 0 0 0]
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

此操作:

    data := *(*[10]int)(unsafe.Pointer(hdr.Data))

将数组复制到 中。此处为新数组,而不是切片的支持数组。[10]intdatadata


查看完整回答
反对 回复 2022-08-30
  • 1 回答
  • 0 关注
  • 81 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信