Golang でのスライスの再スライス
Golang では、スライスは動的なサイズ変更を可能にする柔軟なデータ構造です。ただし、スライスの再スライスの動作を理解するのは混乱する可能性があります。提供されたコードを詳しく調べて、c の容量の不可解な動作を説明しましょう。
func main() { b := make([]int, 0, 5) // Create an empty slice with a capacity of 5 }
ここで、 b は最初は空ですが、その容量は 5 です。これは、基になる配列が最大 5 個を保持できることを意味します。 elements.
c := b[:2] // Create a slice c from b, starting at the beginning (index 0) and ending just before index 2
ここで、c は b の最初の 2 つの要素を参照するスライスです。ただし、 c は基になる配列のコピーを作成しません。これはまだ b へのウィンドウです。
printSlice("c", c) // Print the length, capacity, and elements of c // Output: c len=2 cap=5 [0 0]
予想どおり、c の長さは 2、容量は 5 です。これは、c が b で表される配列全体と、残りの 3 つに引き続きアクセスできるためです。未使用の要素は拡張機能を通じてアクセスできる可能性があります。
d := c[2:5] // Create a slice d from c, starting at index 2 and ending at the end (index 5)
ここで、d はインデックス 2 から最後 (インデックス 5) までの c の要素を参照するスライスです。 c の容量は 5 であるため、d はさらに 3 要素まで拡張できます。
printSlice("d", d) // Print the length, capacity, and elements of d // Output: d len=3 cap=3 [0 0 0]
d は c の残りの要素を参照するため長さが 3 になり、容量は 3 に対応できるため 3 になります。 b.
内にさらに 3 つの要素を追加できます。結論として、スライスの容量は、基になる配列の容量と、その配列内のスライスの開始位置によって決まります。この関係を理解することで、開発者はスライスを効果的に操作し、Golang プログラムでの動作を制御できるようになります。
以上がGo スライスを再スライスすると容量が変わるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。