ホームページ  >  記事  >  バックエンド開発  >  Go スライスの容量がゼロ以外であるにもかかわらず、「パニック: ランタイム エラー: インデックスが範囲外です」というメッセージが表示されるのはなぜですか?

Go スライスの容量がゼロ以外であるにもかかわらず、「パニック: ランタイム エラー: インデックスが範囲外です」というメッセージが表示されるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-02 09:08:03571ブラウズ

Why am I getting

配列の長さが Null でない場合の「パニック: ランタイム エラー: インデックスが範囲外です」のトラブルシューティング

Go で配列を操作する場合、またはスライスの場合、長さと容量の概念を理解することが重要です。指定されたコード スニペットでは、make([]string, 0, 4) を使用して結果配列を初期化することに問題が発生しています。

make([]string, 0, 4)

make([]string, 0, 4) は、初期長 0、容量 4 の []string 型のスライスを作成します。容量は、格納できる要素の最大数を定義します。

長さと容量の区別

長さはスライス内に現在存在する要素の数を示し、容量は保持できる最大サイズを示します。 。スライスにすでに十分な要素が保持されている場合、容量内でさらに項目を追加しても再割り当ては発生しません。ただし、容量を超えると、再割り当てがトリガーされます。これには、新しい基になる配列の作成と既存の要素のコピーが含まれます。

コードでは、make([]string, 0, 4) は、容量のある空のスライスを初期化します。現在の長さ (インデックス 0) を超える要素にアクセスしようとすると、そのインデックスに要素がないため、実行時エラーが発生します。

問題の解決

このエラーは、十分な初期長でスライスを初期化するか、追加を使用して必要に応じてスライスを動的に拡張することで解決できます。

オプション 1: 十分な長さで初期化する

スライスに格納される要素のおおよその数がわかっている場合は、適切な長さで初期化できます。たとえば、 result := make([]string, 4) は、長さと容量が 4 のスライスを初期化します。

オプション 2: Append を使用する

Append は追加します要素をスライスの最後まで追加します。スライスに十分な容量がある場合、新しい要素を収容するためにスライスが再スライスされます。そうでない場合は、新しい基礎となる配列が割り当てられます。 append を繰り返し使用すると、容量を超えることを心配することなく、必要に応じてスライスを徐々に拡張できます。

Append を使用した簡略化されたコード

次は、Append を使用したコードの簡略化されたバージョンです。追加:

<code class="go">package main

import (
    "fmt"
    "strings"
)

func main() {
    strs := strings.Fields("Political srt")
    var result []string
    for _, s := range strs {
        if strings.ContainsAny(s, "eaiu") {
            result = append(result, s)
        }
    }
    fmt.Println(result)
}</code>

以上がGo スライスの容量がゼロ以外であるにもかかわらず、「パニック: ランタイム エラー: インデックスが範囲外です」というメッセージが表示されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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