ホームページ  >  記事  >  バックエンド開発  >  Go スライスの長さが Null 以外の場合に「パニック: ランタイム エラー: インデックスが範囲外です」が発生するのはなぜですか?

Go スライスの長さが Null 以外の場合に「パニック: ランタイム エラー: インデックスが範囲外です」が発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-31 15:24:52503ブラウズ

Why Does

パニック: ランタイム エラー: 配列の長さが Null でない場合、インデックスが範囲外です

提供されたコード スニペットは、文字列を反復処理して次のことを試みます。母音を含む単語を区切ります。ただし、配列の長さが null ではないにもかかわらず、「パニック: ランタイム エラー: インデックスが範囲外です」エラーが発生します。

このエラーを理解するには、基礎となるスライス データ構造を詳しく調べることが重要です。

スライスについて

Go のスライスは、配列セグメントの記述子です。これは、実際の配列へのポインター、セグメントの長さ、およびその容量 (セグメントが収容できる最大長) の 3 つのコンポーネントで構成されます。

make([]string, 0, 4) を使用してスライスを作成する場合、空の基礎となる配列が割り当てられ、初期長は 0、容量は 4 です。

区別

result := make([]string, 0, 4) は、次の点で result := make([]string, 4) と異なります:

  • make([]string, 0, 4): 空の配列を初期化します。つまり、結果にアクセスします。 [0] はパニックを引き起こします。
  • make([]string, 4): 4 つの要素で配列を初期化し、result[0] から result[3] までのアクセスを許可します。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。