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

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

Linda Hamilton
リリース: 2024-12-18 01:16:09
オリジナル
440 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート