配列の長さが Null でない場合に「パニック: ランタイム エラー: インデックスが範囲外です」に進む
配列の長さと容量
Go の配列は、固定数の値を格納し、指定された長さを持ちます。配列の長さによって、配列に含まれる要素の数が決まります。ただし、配列を抽象化した Go スライスでは、容量という別の概念が導入されます。容量は、スライスが保持できる要素の最大数を表します。
make([]T, len, cap) を使用してスライスを作成するとき (T は要素のタイプ)、長さと容量を指定します。容量が長さよりも大きい場合、メモリを再割り当てすることなく、追加の要素を収容できるようにスライスを拡張できます。容量がゼロの場合、長さを容量として使用します。
エラーの解決
提供されたコード スニペットでは、make 関数を使用して [ ]長さ 0、容量 4 の文字列スライス:
<code class="go">result := make([]string, 0, 4)</code>
これは、スライスが最初は 0 個の文字列を保持でき、メモリを再割り当てせずに最大 4 個まで拡張できることを意味します。
「パニック: 実行時エラー: インデックスが範囲外です」というエラーが発生するのは、スライスの長さを超えるインデックスにある要素へのアクセスが無効であるためです。元のコード スニペットでは、ループは result[0] から始まる要素にアクセスしようとしますが、スライスが空であるため、そのインデックスには要素がありません。
スライスへの要素の追加
エラーを解決するには、append 関数を使用して要素をスライスに追加する必要があります。 append 関数は、追加された要素を含む新しいスライスを返します。
<code class="go">result = append(result, "foo")</code>
要素を追加するたびに、スライスの長さが増加し、容量に達すると、より大きな容量を持つ新しい基になる配列が割り当てられます。 。この場合、最初の追加によって長さが 1 に増加し、容量が 4 であるため、再割り当ては必要ありません。
簡略化されたコード例
これは簡略化された例です。これは、append を使用してエラーが発生することなくスライスに要素を追加します:
<code class="go">package main import "fmt" func main() { result := make([]string, 0, 4) // Append elements to the slice result = append(result, "foo") result = append(result, "bar") // Access the elements using valid indices fmt.Println(result[0]) // Output: foo fmt.Println(result[1]) // Output: bar }</code>
この例では、make 関数は初期長 0、容量 4 のスライスを作成します。次に、append を使用します。スライスに 2 つの要素を追加します。最後に、「インデックスが範囲外です」エラーが発生することなく、有効なインデックスを使用して要素にアクセスできます。
以上が配列の長さが null でない場合でも、Go コードが「パニック: ランタイム エラー: インデックスが範囲外です」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。