なぜ Go では基になる配列の長さまでスライスをスライスできるのですか?
Go の配列とスライスは、便利な操作方法を提供します。データコレクション。驚くべきかもしれない特定の動作の 1 つは、スライスを容量ではなくその長さまでスライスする機能です。これを理解するために、Go 仕様を詳しく見てみましょう。
Go 仕様のスライス式セクションによると、配列または文字列の場合、インデックスは次の条件を満たす場合に範囲内とみなされます:
0 <= low <= high <= len(a)
インデックスがこの範囲外にある場合、範囲外とみなされます。ただし、スライスの場合、インデックスの上限は、len(a) で示される長さではなく、cap(a) で示されるスライス容量です。
これは、スライスに対する次のスライス操作を意味します。 a は len(a) まで許容されます:
a[0:] a[1:] a[2:]
これらの場合、結果として得られるスライスはインデックス 0 から始まり、長さは 0 になります。それぞれ 1、2 です。
ただし、a の長さを超えてスライスするとパニックが発生します。
a[3:] // Doesn't panic (empty slice) a[4:] // Panics
a[3:] スライスはインデックス 3 であるためパニックしません。たとえ結果が空のスライスであっても、範囲は [0, len(a)] 内にあります。一方、a[4:] は、インデックス 4 が範囲外であるためパニックします。範囲は [0, len(a)) として定義されます。
したがって、Go では、次の長さまでのスライスが許可されます。これは、スライスのインデックスの上限が長さではなく容量によって定義されると仕様で明示的に規定されているためです。この動作により、一般的なシナリオで意図しないパニックを引き起こすことなく、便利なスライス操作が可能になります。
以上が碁のスライスは、容量だけでなく、長さまでスライスできるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。