スライス要素を最初に削除すると容量が減少するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-11-05 10:38:02
オリジナル
239 人が閲覧しました

Why Does Dropping Slice Elements at the Beginning Reduce Capacity?

Go ツアー #11: スライス容量の変更を理解する

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!