ホームページ  >  記事  >  バックエンド開発  >  Go でスライスをスライスすると容量が変わることがあるのはなぜですか?

Go でスライスをスライスすると容量が変わることがあるのはなぜですか?

DDD
DDDオリジナル
2024-11-04 21:02:02660ブラウズ

Why Does Slicing a Slice in Go Sometimes Change Its Capacity?

このスライスは Go の容量を変更するのはなぜですか?

前述の「A Tour of Go」スライドでは、スニペットに次の操作が含まれています。整数のスライス。スライスの長さは一貫して変化していますが、最後の行では容量が減少しているように見えます。この動作により、スライス容量の変更可能性について疑問が生じます。

容量が 6 から 4 に変更

スライスの容量は、スライスが保持できるスロットの数を表します。当初、スライスの容量は 6 です。データがスライスの末尾 (s = s[2:]) から削除されるとき、開始インデックスとバッキング配列の末尾の間の距離は変わらないため、容量は変わりません。

ただし、最初の 2 つの値 (s = s[2:]) を削除してスライスの開始インデックスを前方に移動すると、開始インデックスとバッキング配列の終わりの間の距離が減少し、容量が 4 に減りました。これは、スライスがアレイのより小さい部分を占めるようになったためです。

最後の行だけが容量を変更する理由

容量は次の場合にのみ変更されます。スライスの開始インデックスが変更されます。スライスをゼロ長にスライスしたり、スライスの長さを拡張したりするその他の操作は、開始インデックスを変更しないため、容量には影響しません。

スライス ヘッダー

より深く理解するには、リフレクションを使用してスライスのヘッダーを出力すると、データ ポインターの変更が表示されます。ヘッダーのデータ フィールドはバッキング アレイ内のスライスの開始インデックスを示し、Cap は容量を表します。

最後の呼び出しでは、データ フィールドが前方にシフトされ、開始インデックス間の距離に応じて容量が減少します。そしてバッキング配列の終わりが減ります。

以上がGo でスライスをスライスすると容量が変わることがあるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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