ホームページ >バックエンド開発 >Golang >Go スライスで `a[len(slice)]` がパニックにならないのはなぜですか?

Go スライスで `a[len(slice)]` がパニックにならないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-12 16:40:10476ブラウズ

Why Doesn't `a[len(slice)]` Panic in Go Slices?

Go の複雑なスライス: なぜ a[len(slice)] はパニックにならないのか

はじめに

Go では、配列またはスライスをスライスするとき、基になる配列またはスライスの長さを超えると、 パニック。ただし、スライスの場合、この動作は奇妙なことに分岐します。

問題

次の Go コードを考えてみましょう。

スライスが a であることを困惑させます。 [3:] は、長さを超えているように見えても、パニックを引き起こしません。 array.

答え

この動作は Go 言語仕様によって規定されています:

  • 配列と文字列の場合、範囲外のインデックスは low > として定義されます。 len(a) または高 > len(a)、ここで、a は基礎となる配列です。
  • スライスの場合、範囲外のインデックスは high > として定義されます。 cap(a)。ここで、cap(a) はスライスの容量を表します。

この例では、a は配列であり、その長さは 3 です。ただし、配列の長さまでスプライスすると、つまり、a[3:] は、基になる配列の長さが 3 であるため、有効な範囲内であるとみなされます。

仕様で説明されているように、「インデックスの上限はスライスです」長さではなく容量の上限(a)です。」したがって、この場合、高 - 低 = 3 - 3 = 0 であるため、a[3:] は空のスライスを作成します。

キーの区別

が重要です。スライスの容量を超えるインデックス (つまり、この例では a[4:]) を使用すると、範囲外のままになり、実行時パニックが発生することに注意してください。仕様では、「実行時にインデックスが範囲外の場合、実行時パニックが発生します。」

と明示的に述べられています。

以上がGo スライスで `a[len(slice)]` がパニックにならないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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