スライスについて: 容量と長さ
Go でスライスを扱う場合、容量と長さの関係を理解することが重要です。容量はスライスが動作する基になる配列のサイズを指し、長さはスライス内に現在含まれている要素の数を指定します。
実行時エラー: スライスの長さが容量を超えています
長さよりも小さい容量のスライスを作成しようとすると、「実行時エラー:makeslice:cap out of range」というエラーが発生します。このエラーは、スライスが設計上、長さが容量を超えることのない不変式を維持するために発生します:
0 ≤ len(s) ≤ cap(s)
コード例では:
type b []int var k = make([]b, 10, 5) fmt.Println(k[8])
型のスライス k を定義しました。 []b、ここで b は別のスライス タイプです。ただし、このスライスを容量 5 で作成しようとしましたが、長さ 10 に対応するには不十分です。そのため、実行時エラーが発生します。
Why Not a Compile-Timeエラー?
場合によっては、容量と長さの値が静的な場合、コンパイラがコンパイル時にエラーを検出する可能性があります。ただし、これは常に実現できるわけではありません。次のコードを考えてみましょう:
package main import ( "fmt" "rand" ) func main() { k := make([]int, rand.Int(), rand.Int()) fmt.Println(k) }
ここで、容量と長さの値は、rand パッケージを使用して実行時に動的に決定されます。そのため、コンパイラーは、容量が常に長さを超えるかどうかを静的に検証することができないため、このチェックをランタイムに委任する必要があります。
以上がスライスの長さが容量を超えると Go がランタイム エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。