Go のツアーでは、整数のスライスが初期化され、一連の処理を通じて変更されるスライスの動作を示します。操作。デモでの不可解な観察の 1 つは、最後の行の最初の 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>
出力要素がスライスの先頭または末尾からドロップされたときにデータ ポインタがどのように移動するかを示します:
header=&{Data:272990208 Len:6 Cap:6} len=6 cap=6 [2 3 5 7 11 13] header=&{Data:272990208 Len:0 Cap:6} len=0 cap=6 [] header=&{Data:272990208 Len:4 Cap:6} len=4 cap=6 [2 3 5 7] header=&{Data:272990216 Len:2 Cap:4} len=2 cap=4 [5 7]
以上がスライス要素を最初に削除すると容量が減少するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。