スライス容量の変更: 最初のアイテムと最後のアイテムの削除の違い
Go のスライス機能を調べていると、よくある疑問が生じます。最初の n 個の項目をドロップするときと、最後の n 個の項目をドロップするときの容量の動作は異なりますか?
これに答えるには、Go スライスが次のように構造化されていることを理解することが重要です。
type slice struct { array unsafe.Pointer len int cap int }
最後の n 項目の削除
スライスから最後の n 項目を削除する場合 (例: s = s[:len(s)-2])、スライスのデータは基になる配列に格納されたままになります。 。 len フィールドはスライスの新しい長さを反映するように更新されますが、cap フィールドは変更されません。これにより、スライスに対して同じ配列割り当てが保持されます。
最初の n 項目の削除
ただし、最初の n 項目が削除される場合 (例: s = s[2: ]))、スライスの基礎となるデータを同じ配列の別の部分に移動する必要があります。これは、最初の n 要素の元のメモリ位置が無効になっているためです。その結果、len フィールドと cap フィールドの両方を調整して、異なる配列ポインターを使用して新しいスライスが作成されます。
これを説明するために、printSlice 関数を拡張して、基になる配列へのポインターを表示してみましょう。
<code class="go">func printSlice(s []int) { var ptr *int if cap(s) >= 1 { ptr = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
この変更されたコードを実行すると、スライス操作によってポインター、長さ、容量がどのように変更されるかを示し、上記の動作を確認します。
以上が最初のスライス要素を削除すると容量が変わるのに、最後の要素を削除すると容量が変わらないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。