マップ値のアドレス指定
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 サイトの他の関連記事を参照してください。