在 Go 中,切片是對底層數組的引用,它們的頭存儲有關切片長度和容量的信息,以及指向基礎數據。雖然切片的內容可以修改,但其標頭通常保持不變。
考慮以下程式碼片段:
var buffer [256] byte func 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)) }
當呼叫函數 SubtractOneFromLength 時,它會修改切片,但不是切片頭。要檢查切片頭,您可以使用reflect.SliceHeader類型。
type SliceHeader struct { Data uintptr Len int Cap int }
以下不安全操作示範如何將切片指標轉換為*reflect.SliceHeader:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
然後您可以使用格式字串% v:
fmt.Printf("%+v", sh)
Go Playground產生以下輸出:
&{Data:1792106 Len:8 Cap:246}
此輸出提供底層資料 (Data) 的記憶體位址、切片的長度 (Len) 及其容量 (Cap)。
不帶unsafe:
不使用unsafe存取切片頭資訊也是如此可能:
以上是如何安全和不安全地檢查Go Slice的頭部?的詳細內容。更多資訊請關注PHP中文網其他相關文章!