亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

底層數組在 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 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號