這是來(lái)自切片的略微修改的代碼var buffer [256] bytefunc SubtractOneFromLength(slice []byte) []byte {? ? slice = slice[0 : len(slice)-1]? ? return slice}func main() {? ? slice := buffer[10:20]? ? fmt.Println("Before: len(slice) =", len(slice))? ? newSlice := SubtractOneFromLength(slice)? ? fmt.Println("After:? len(slice) =", len(slice))? ? fmt.Println("After:? len(newSlice) =", len(newSlice))? ? newSlice2 := SubtractOneFromLength(newSlice)? ? fmt.Println("After:? len(newSlice2) =", len(newSlice2))}它說切片參數(shù)的內(nèi)容可以被函數(shù)修改,但它的頭不能。如何在我的屏幕上打印 newSlice2 的標(biāo)題?
1 回答

鳳凰求蠱
TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
切片頭由以下類型表示reflect.SliceHeader
:
type?SliceHeader?struct?{ ????????Data?uintptr ????????Len??int ????????Cap??int}
您可以使用 packageunsafe
將切片指針轉(zhuǎn)換為*reflect.SliceHeader
如下所示:
sh?:=?(*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
然后你可以像任何其他結(jié)構(gòu)一樣打印它:
fmt.Printf("%+v",?sh)
輸出將是(在Go Playground上嘗試):
&{Data:1792106?Len:8?Cap:246}
unsafe
另請(qǐng)注意,您可以在不使用 package and 的情況下訪問存儲(chǔ)在切片標(biāo)頭中的信息reflect
:
要獲得該
Data
字段,您可以使用&newSlice2[0]
要獲取
Len
字段,請(qǐng)使用len(newSlice2)
要獲取
Cap
字段,請(qǐng)使用cap(newSlice2)
- 1 回答
- 0 關(guān)注
- 126 瀏覽
添加回答
舉報(bào)
0/150
提交
取消