最近、Golangでコードを書いているときに「範囲変数に代入できません…」というエラーが発生し、解決方法がわからず非常に悩みました。いくつかの探索と調査を経て、ついに解決策を見つけたので、それを皆さんと共有します。
まず、このエラーが発生するシナリオを見てみましょう。 Golang では、通常、コンテナ内の要素 (配列、スライスなど) を反復するために range キーワードを使用しますが、反復プロセス中に要素を変更したい場合、「範囲変数に代入できません...」というエラーが表示されます。現れる。 。以下は例です:
package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} for _, num := range nums { num = num * 2 // 报错:“cannot assign to range variable num” } fmt.Println(nums) }
この例では、nums の各要素を 2 で乗算したいと考えています。しかし、コンパイル プロセス中にエラーが発生しました。「範囲変数 num に代入できません」。これはなぜですか? ?
その理由は、Golang の範囲キーワード反復では、要素自体ではなく、要素のコピーが取得されるためです。ループ本体内のコピーを変更しても、元の要素は変更されません。したがって、num の値の変更は無効であり、エラーが発生します。
それでは、この問題をどうやって解決すればいいのでしょうか?これを解決するには 2 つの方法があります。
方法 1: インデックスの反復を使用する
for ループでインデックスを使用してコンテナー内の要素を反復し、コンテナーの値を変更する代わりに、元の要素の値を変更できます。コピー。コードの実装は次のとおりです。
package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} for i := range nums { nums[i] = nums[i] * 2 } fmt.Println(nums) }
コードでは、コンテナ nums 内の要素を反復し、nums[i] の値を変更するためのインデックスとして i を使用します。このようにして、元の要素の値を正常に変更でき、出力結果は [2 4 6 8 10] になります。
方法 2: ポインターを使用する
要素へのポインターを使用して、この問題を解決することもできます。元の要素の値は、反復されたコピーへのポインターをパラメーターとして関数に渡すことによって変更できます。コードの実装は次のとおりです。
package main import "fmt" func double(num *int) { *num = *num * 2 } func main() { nums := []int{1, 2, 3, 4, 5} for i, num := range nums { double(&nums[i]) } fmt.Println(nums) }
コードでは、パラメータが int 型へのポインタである double 関数を定義します。 for ループでは、コンテナ nums の要素を反復処理し、反復されたコピーのポインタを double 関数に渡します。この関数は、元の要素の値を変更してそれを返します。このようにして、元の要素の値を正常に変更でき、出力結果は [2 4 6 8 10] になります。
要約すると、Golang の「範囲変数に代入できません...」エラーを解決するには、インデックス反復を使用する方法とポインタを使用する方法の 2 つを使用できます。特定のビジネス ニーズに応じて、適切な解決方法を選択する必要があります。
以上がgolang エラー:「範囲変数に代入できません...」どうすれば解決できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。