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)
The Go Playground は次の出力を生成します:
&{Data:1792106 Len:8 Cap:246}
この出力は、基礎となるデータのメモリ アドレス (Data)、スライスの長さ (Len)、およびその容量 (Cap) を提供します。
unsafe なし:
unsafe なしでスライスヘッダー情報にアクセスすることもできます。可能:
以上がGo スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。