Go で文字列を操作するときに、"それらをループしようとすると、インデックスが範囲外です」というランタイム エラーが発生します。この問題は、基になる配列が空でない場合でも発生する可能性があります。これを解決するには、スライスの割り当てと追加の微妙な違いを理解する必要があります。
Go のスライスは、ポインター、長さ、および配列のセグメントを表します。容量。 make([]string, 0, 4) を使用してスライスを作成する場合、長さ 0 と容量 4 を指定します。これは、基になる配列が空であることを意味し、要素に直接アクセスすると実行時エラーが発生します。
対照的に、make([]string, 4) は 4 つの要素を含む配列を割り当て、空の文字列で初期化します。したがって、このスライス内の要素にアクセスしても、エラーは発生せずに安全です。
追加関数は、要素をスライスに追加することでスライスの長さを拡張します。スライスに十分な容量がある場合は、新しい要素を収容できるように基礎となる配列のサイズが変更されます。ただし、容量が不十分な場合は、新しい配列が作成されます。
指定されたコード スニペットでは、結果のスライスは最初は空です。ループ内で Append を使用して要素を追加すると、現在の長さを超えるインデックスでスライスにアクセスしようとし、実行時エラーが発生します。
この問題を解決するには、ループ内の要素にアクセスする前の結果スライスの長さはゼロ以外になります。これは、初期長でスライスを割り当てるか、変更された方法で追加を使用することによって実現できます。
次のコード スニペットを考えてみましょう。
<code class="go">package main import "fmt" import "strings" func myFunc(input string) []string { strs := strings.Fields(input) // Extract words from the input string result := make([]string, 0, 4) // Initialize an empty slice with a capacity of 4 for _, s := range strs { if strings.ContainsAny(s, "eaiu") { // Check if the word contains a vowel result = append(result, s) // Append the word to the slice } } return result } func main() { fmt.Println(myFunc("Political")) }</code>
このコードでは、make([]string , 0, 4) は、容量 4 の空のスライスを初期化します。次に、ループは入力文字列内の各単語を反復処理し、母音が含まれている場合は結果のスライスにその単語を追加します。要素にアクセスする前にループによってスライスの長さがゼロ以外であることが確認されるため、append 関数は正しく使用されています。
以上が配列の長さがゼロ以外であっても、スライスを操作するときに Go が「パニック: ランタイム エラー: インデックスが範囲外です」エラーをスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。