簡體   English   中英

底層數組如何在 Golang 中的“切片”中表現

[英]How the underlying array behaves in 'slice' in Golang

我對切片中的數組感到很困惑。 代碼貼在下面。

我了解 test() 從 main() 獲取 arr 的副本,並且 test() 中的“附加”沒有分配新數組,因為 cap > len。

但是,測試切片 arr[] 和主切片 arr[] 中的底層數組似乎不同,因為它們的地址不同。

另一方面,test() 中的“追加”操作確實修改了 main() 中的底層數組,因為在打印主切片的底層數組時會出現一個新的“1”。 此外,test() 能夠設置 arr[0] = 10,這在 main() 中可見。

這是怎么發生的?

slice 中數組的地址取自這篇文章

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)
}

Output:

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]

這個操作:

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

[10]int數組復制到data中。 在這里, data是一個新數組,而不是切片的后備數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM