ホームページ > バックエンド開発 > Golang > Go の range キーワードを使用すると配列要素を変更できないのはなぜですか? 配列インデックスはどのように解決策を提供できるのでしょうか?

Go の range キーワードを使用すると配列要素を変更できないのはなぜですか? 配列インデックスはどのように解決策を提供できるのでしょうか?

Barbara Streisand
リリース: 2024-12-17 11:23:25
オリジナル
217 人が閲覧しました

Why Does Using Go's Range Keyword Fail to Modify Array Elements, and How Can Array Indices Provide a Solution?

範囲値の代わりに要素の変更に配列インデックスを使用する

Go プログラミングでは、range キーワードはコレクションを反復処理し、両方のキーを返しますそして各要素の値のコピー。この動作により、ループ内での値の変更が妨げられる可能性があります。次の例は、この問題を示しています。

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempt to modify field using range values:
    for _, e := range array {
        e.field = "foo"
    }

    // Verify that field hasn't been modified:
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
ログイン後にコピー

このコードでは、範囲ループを使用して配列内の各要素のフィールドを変更しようとしています。ただし、範囲は値のコピーを返すため、配列内の実際の要素は変更されません。これにより、すべてのフィールド値が空のままになります。

解決策: 配列インデックスの使用

この問題を回避して実際の要素を変更するには、代わりに配列インデックスを使用する必要があります。範囲ループによって返される値。変更されたコードは次のとおりです。

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Modify field using array indices:
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Verify that field has been modified:
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
ログイン後にコピー

値の代わりに各要素のインデックスを使用することで、配列内の実際の要素に直接アクセスして変更できます。これにより、フィールド値が正しく更新されます。

以上がGo の range キーワードを使用すると配列要素を変更できないのはなぜですか? 配列インデックスはどのように解決策を提供できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート