ホームページ > バックエンド開発 > Golang > 再スライスされた Go スライスの容量が元のスライスの容量と一致しないのはなぜですか?

再スライスされた Go スライスの容量が元のスライスの容量と一致しないのはなぜですか?

DDD
リリース: 2024-12-27 15:44:10
オリジナル
568 人が閲覧しました

Why Doesn't the Capacity of a Re-sliced Go Slice Match the Original Slice's Capacity?

Golang でのスライスの再スライス: スライスのダイナミクスを理解する

Go プログラミングの領域では、配列とスライスのスライスは基本的な概念です。ただし、提供されたコードで強調表示されているような複雑な問題に遭遇すると、初心者は困惑する可能性があります。再スライスされたスライスの容量に関する混乱を解き明かしてみましょう。

コード例は、配列からスライスを作成し、それらのスライスの 1 つを再スライスするプロセスを示しています。ただし、これによって論点が生じます。なぜ再スライスされたスライスの容量が、元のスライスの実際の容量と一致しないのでしょうか?

これを理解するには、の内部を詳しく調べる必要があります。 Golangでスライスする。スライスが配列から作成されると、基本的にその配列にウィンドウが提供されます。要素の個別のコピーは作成されません。単に基礎となる配列を参照するだけです。スライスの長さは現在含まれている要素の数を表し、その容量は潜在的に保持できる要素の最大数を示します。

元のスライスの容量 (この場合は b) が決定されます。作成元の配列のサイズによって異なります。ただし、再スライスが実行されると (b から c を作成するなど)、新しいスライス (c) の長さは提供されたインデックスに基づいて調整されますが、容量は変わりません。これは、再スライスされたスライスが元のスライスと同じ基になる配列を共有しているためです。

言い換えると、再スライスされたスライスの容量は、常に元のスライスの容量から開始インデックスを引いたものになります。スライスし直したもの。この例では、b の容量は 5 です。c は 0 番目のインデックスから再スライスされるため、その容量は 5 - 0 = 5 になります。これは、長さが 2 しかないにもかかわらず、c の容量が 5 である理由を説明しています。

これをさらに説明するために、コード例を少し変更してみましょう。

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
ログイン後にコピー

この変更されたコードでは、 d は再スライスされたものです。インデックス 1 から始まりインデックス 5 まで上がる b のスライス。最初の要素に値 1 を代入して d を変更すると、c も影響を受けることが観察されるのは興味深いことです。これは、c と d の両方が、同じ基礎となる配列 b への異なるウィンドウにすぎないためです。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート