ホームページ  >  記事  >  バックエンド開発  >  Go Tour スライド 11 の最初の 2 つの要素を削除するとスライス容量が減少するのに、スライスの長さを延長するとスライス容量が減少しないのはなぜですか?

Go Tour スライド 11 の最初の 2 つの要素を削除するとスライス容量が減少するのに、スライスの長さを延長するとスライス容量が減少しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 06:43:03822ブラウズ

Why does the slice capacity decrease when dropping the first two elements in Go Tour slide 11, but not when extending the slice length?

Go ツアー #11 でのスライス容量の変更について

Go ツアーでは、スライスを含む言語の機能についての洞察に富んだデモンストレーションが提供されます。スライド 11 では、整数のスライスを操作してそのプロパティを示します。しかし、ある観察により疑問が生じます。前の操作ではスライス容量が変化していないのに、なぜ最後の行では変化するのでしょうか?

スライス操作が容量に及ぼす影響を理解する

スライス容量とは、再割り当てが必要になる前に基になる配列が保持できる要素の最大数を指します。 Go Tour コード スニペットは次の操作を実行します:

  1. 作成: 初期スライス s が長さと容量 6 で作成されます。
  2. 長さゼロへのスライス: s[:0] は、s の先頭から始まりインデックス 0 で終わる新しいスライスを作成し、事実上長さ 0 に切り詰めます。バッキング配列から要素が削除されないため、容量は 6 のままです。
  3. スライス長の拡張: s[:4] は、最初の 4 つの要素を含むようにスライスを拡張します。バッキング配列にはまだスペースがあるため、容量は 6 のままです。
  4. 最初の 2 つの値の削除: s[2:] は s の最初の 2 つの要素を削除しますが、容量は 4 に減少します。これは、スライスが残りの要素を保持しており、スライスの先頭 (s[2]) とバッキング配列の末尾の間の距離が減少しているために発生します。

理由最後の行の容量削減のため

  • スライス データ ポインタの移動: 最初の 2 つの要素を削除すると、スライス データ ポインタが 2 つ右に移動します。これにより、スライスの先頭とバッキング配列の末尾の間の距離が効果的に短縮されます。
  • バッキング配列への影響なし: すべてのスライス操作は、バッキング配列ではなく、スライス ヘッダーのみを変更します。 。バッキング配列は変更されず、容量は 6 です。

ヘッダーの変更の視覚化

次のコードはスライス ヘッダーを出力します。これにより、追加の洞察が得られます。変更点:

<code class="go">func printSlice(s []int) {
    sh := (*reflect.SliceHeader)(unsafe.Pointer(&s))
    fmt.Printf("header=%+v len=%d cap=%d %v\n", sh, len(s), cap(s), s)
}</code>

出力は、最初の 2 つの要素が削除されると、ヘッダー データ ポインターが 272990208 から 272990216 に移動し、スライス容量が減少することを示しています。

以上がGo Tour スライド 11 の最初の 2 つの要素を削除するとスライス容量が減少するのに、スライスの長さを延長するとスライス容量が減少しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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