SliceHeader 如其名,Slice + Header,看上去很直觀,實(shí)際上是 Go Slice(切片)的運(yùn)行時表現(xiàn)。 SliceHeader 的定義如下: 1 2 3 4 5 type SliceHeader struct { Data uintptr Len int Cap int } Data:指向具體的底層數(shù)組。 Len:代表切片的長度。 Cap:代表切片的容量。
其在內(nèi)部轉(zhuǎn)換的Data屬性,正正是 Go 語言中slice類型的運(yùn)行時表現(xiàn)SliceHeader。我們在調(diào)用%p輸出時,是在輸出slice的底層存儲數(shù)組元素的地址。 下一個問題是:為什么slice類型可以直接修改源數(shù)據(jù)的值呢。 其實(shí)和輸出的原理是一樣的,在 Go 語言運(yùn)行時,傳遞的也是相應(yīng) slice 類型的底層數(shù)組的指針,但需要注意,其使用的是...
首先讓我們直接訪問slice頭,然后打印出數(shù)據(jù)指向的內(nèi)存。 復(fù)制代碼代碼如下: dataslice := *(*reflect.SliceHeader)(unsafe.Pointer(&data.aSlice)) fmt.Printf("Slice data is %#v\n", (*[3]byte)(unsafe.Pointer(dataslice.Data))) 這是輸出: 復(fù)制代碼代碼如下: Slice data is &[3]uint8{0x8, 0x9...