ホームページ >バックエンド開発 >Golang >golang エラー:「範囲変数に代入できません...」どうすれば解決できますか?

golang エラー:「範囲変数に代入できません...」どうすれば解決できますか?

王林
王林オリジナル
2023-06-24 13:43:40861ブラウズ

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

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