ホームページ > バックエンド開発 > Golang > Go Map 値内の構造体フィールドを変更するには?

Go Map 値内の構造体フィールドを変更するには?

DDD
リリース: 2024-11-28 19:51:11
オリジナル
927 人が閲覧しました

How to Modify Struct Fields Within Go Map Values?

マップ値のアドレス指定

Go では、次の例に示すように、マップ値内で構造体フィールドを直接変更しようとすると、コンパイル エラーが発生します:

import (
    "fmt"
)

type pair struct {
    a float64
    b float64
}

func main() {
    // Create a map where values are of the "pair" type.
    dictionary := make(map[string]pair)

    // Add an element to the map.
    dictionary["xxoo"] = pair{5.0, 2.0}

    fmt.Println(dictionary["xxoo"]) // Output: {5 2}

    // Attempt to modify a field within the map value.
    dictionary["xxoo"].b = 5.0 // Error: cannot assign to dictionary["xxoo"].b
}
ログイン後にコピー

このエラー メッセージは、マップ値がアドレス指定できないために発生します。アドレス指定可能性は Go の基本的な概念であり、変数のメモリ アドレスを特定する機能を指します。アドレス指定不可能な値の構造体フィールドにアクセスしようとするとコンパイル エラーが発生するため、アドレス指定不可能な値を間接的に変更することはできません。

この問題を解決するには、主に 2 つの方法があります。

ポインター値の使用

1 つの方法は、ポインター値をマップ値として使用することです。この間接化により値がアドレス指定可能になり、フィールドの変更が可能になります。以下に例を示します。

import (
    "fmt"
)

type pair struct {
    a float64
    b float64
}

func main() {
    // Create a map where values are pointers to "pair" structs.
    dictionary := make(map[string]*pair)

    // Add an element to the map.
    dictionary["xxoo"] = &pair{5.0, 2.0}

    fmt.Println(dictionary["xxoo"]) // Output: &{5 2}

    // Modify a field within the pointed-to struct.
    dictionary["xxoo"].b = 5.0

    fmt.Println(dictionary["xxoo"].b) // Output: 5
}
ログイン後にコピー

値のコピーまたは置換

または、値をコピーするか完全に置換することで、アドレス指定できない値を操作することもできます。以下に 2 つの例を示します。

// Value Copying
dictionary["xxoo"] = pair{5.0, 5.0}
ログイン後にコピー
// Value Replacement
p := dictionary["xxoo"]
p.b = 5.0
dictionary["xxoo"] = p
ログイン後にコピー

どちらのアプローチでも、マップ内の「ペア」構造体を変更できます。

以上がGo Map 値内の構造体フィールドを変更するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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