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