我對(duì)切片中的數(shù)組感到非常困惑。代碼發(fā)布在下面。我理解 test() 從 main() 獲取 arr 的副本,而 test() 中的 'append' 不會(huì)分配新數(shù)組,因?yàn)?cap > len。但是,測(cè)試切片 arr[] 和主切片 arr[] 中的基礎(chǔ)數(shù)組似乎不同,因?yàn)樗鼈兊牡刂凡煌A硪环矫?,test() 中的 'append' 操作確實(shí)修改了 main() 中的基礎(chǔ)數(shù)組,因?yàn)楫?dāng)打印主切片的基礎(chǔ)數(shù)組時(shí),會(huì)出現(xiàn)一個(gè)新的 '1'。此外,test() 能夠設(shè)置 arr[0] = 10,這在 main() 中是可見(jiàn)的。這是如何發(fā)生的?切片中數(shù)組的地址取自這篇文章。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]
底層數(shù)組在 Golang 的“切片”中的行為
月關(guān)寶盒
2022-08-30 15:04:11