パニック: ランタイム エラー: 配列の長さが Null でない場合、インデックスが範囲外です
提供されたコード スニペットは、文字列を反復処理して次のことを試みます。母音を含む単語を区切ります。ただし、配列の長さが null ではないにもかかわらず、「パニック: ランタイム エラー: インデックスが範囲外です」エラーが発生します。
このエラーを理解するには、基礎となるスライス データ構造を詳しく調べることが重要です。
スライスについて
Go のスライスは、配列セグメントの記述子です。これは、実際の配列へのポインター、セグメントの長さ、およびその容量 (セグメントが収容できる最大長) の 3 つのコンポーネントで構成されます。
make([]string, 0, 4) を使用してスライスを作成する場合、空の基礎となる配列が割り当てられ、初期長は 0、容量は 4 です。
区別
result := make([]string, 0, 4) は、次の点で result := make([]string, 4) と異なります:
append について
append 関数は、スライスの末尾に要素を追加します。スライスに十分な容量がある場合は、新しい要素を収容できるように宛先を再スライスします。それ以外の場合は、新しい基になる配列が割り当てられます。
コードへの適用
提供されたコードの行の結果 := make([]string, 0, 4 ) は空のスライスを作成します。ループ内で result[0] にアクセスしようとすると、パニックが発生します。
この問題を修正するには、次のコード スニペットのように、append を使用してスライスを設定します。
<code class="go">for i := 0; i < len(strs); i++ { if strings.ContainsAny(strs[i], "eaiu") { result = append(result, strs[i]) } }</code>
あるいは、範囲ベースのループを使用してコードを簡素化することもできます:
<code class="go">for _, s := range strs { if strings.ContainsAny(s, "eaiu") { result = append(result, s) } }</code>
以上がGo スライスの長さが Null 以外の場合に「パニック: ランタイム エラー: インデックスが範囲外です」が発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。