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

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

Barbara Streisand
リリース: 2024-12-26 13:42:16
オリジナル
550 人が閲覧しました

Why Does Re-slicing a Go Slice Change Its Capacity?

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

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