Go での長さを超えたスライス
Go でスライスをスライスするとき、長さを超えたインデックスを指定することができます。この動作はなぜ発生しますか?また、その影響は何ですか?
Go の仕様に従って、配列およびスライスのインデックスは、0 ≤ low ≤ high ≤ len(a) の場合、範囲内であるとみなされます。したがって、配列または文字列の場合、インデックスは len(a) まで有効です。ただし、スライスの場合、インデックスの上限は長さではなく容量 cap(a) によって決まります。
指定された例では、
a := []int{1, 2, 3} fmt.Println(a[0:]) fmt.Println(a[1:]) fmt.Println(a[2:]) fmt.Println(a[3:]) // doesn't panic - why?? fmt.Println(a[4:]) // panics as expected
a[3:] はそうではありません。これは、スライスの現在の長さを超えているものの、その容量内にとどまっている、基になる配列の一部を参照しているためです。これにより、空のスライスが作成されます。ただし、a[4:] は配列の実際の長さを超えるため、パニックを引き起こします。
仕様によれば、指定された範囲外のインデックスにアクセスすると、実行時パニックが発生します。ただし、スライスの場合、容量はスライス目的の拡張範囲と見なすことができ、len(a) までのインデックスを許可します。
以上がGo スライスでは、なぜパニックを起こさずに長さを超えたインデックス作成が許可されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。