スライス容量の変化の謎
A Tour of Go では、スライス操作を示す興味深いスニペットが提供されています。スライスをスライスし、長さをゼロのままにして、その長さを延長したにもかかわらず、最後の行で容量が 6 から 4 に減少する理由に謎があります。
スライスの内部構造を理解する
この謎を解決するには、スライスがデータを配列に格納することを覚えておくことが重要です。最初の 2 つの要素が削除されると、スライスの開始点が右にシフトされ、スライスの開始点とバッキング配列の終了点の間に未割り当てのスロットが少なくなります。
逆に、スライスの終了点から要素が削除されます。配列内のスライスの開始点と配列の終端の間の距離は変更されないため、その容量には影響しません。
これらの操作は、基礎となる配列に影響を与えることなく、スライス構造のみを変更することに注意することが重要です。
例の説明
スライスヘッダーを出力することで、発生する変更についての洞察が得られます。
<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>
最後のステップでは、データ ポインタが進められるため、容量が減少します。
結論
この例では、スライス操作によってスライスの構造がどのように変更されるかを観察します。ポインタを操作することで、スライス上で実行される特定のアクションに基づいて容量を変更できます。
以上が最初から要素を削除するとスライス容量が低下するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。