ホームページ >バックエンド開発 >Golang >Go スライス「c」と「d」の値と容量がスライス後に異なるのはなぜですか?

Go スライス「c」と「d」の値と容量がスライス後に異なるのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-21 02:35:10239ブラウズ

Why Do Go Slices `c` and `d` Have Different Values and Capacities After Slicing?

Go のスライスの容量と長さを理解する

Go のチュートリアルから Go を学習すると、次のような質問に遭遇することがあります。

質問:

以下のコードでは、なぜスライス c と d は異なる値と容量で初期化されますか?

func main() {
  a := make([]int, 5)
  b := make([]int, 0, 5)
  c := b[:2]
  d := c[2:5]
}

答え:

Go では、スライスは配列によってバックアップされます。 make でスライスが作成されると、バッキング配列はゼロ値で初期化されます。この場合、これは整数の配列であり、それぞれ 0 に初期化されます。

c が b のスライスとして作成されると、b と同じバッキング配列を共有します。 b は長さ 0 の配列で作成されたため、バッキング配列の最初の 2 つの要素は 0 です。したがって、c の長さは 2 で、その要素は両方とも 0 です。

d は次のスライスとして作成されます。 c はインデックス 2 から始まります。また、c と同じバッキング配列を共有します。ただし、フルスライス式なので容量が異なります。完全なスライス式の容量は、最初と最後のインデックスの差に等しいです。この場合、5 - 2 = 3 です。

追加リソース:

  • [Go スライス: 使用法と内部](https://blog.golang.org/slices)
  • [配列、スライス (および文字列): '追加' の仕組み](https://blog.golang.org/slices-追加中)

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

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