ホームページ >バックエンド開発 >Golang >Go スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?

Go スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-18 01:16:09445ブラウズ

How Can I Inspect the Header of a Go Slice Safely and Unsafely?

スライス ヘッダーの検査

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 なしでスライスヘッダー情報にアクセスすることもできます。可能:

  • データには &newSlice2[0] を使用
  • len(newSlice2) for Len
  • cap(newSlice2) for Cap

以上がGo スライスのヘッダーを安全または安全に検査するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。