Home >Backend Development >Golang >How to Modify Struct Fields Within Go Map Values?
Addressing Map Values
In Go, attempting to modify a struct field directly within a map value, as shown in the following example, will result in a compilation error:
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 }
This error message is encountered because map values are not addressable. Addressability is a fundamental concept in Go, and it refers to the ability to locate a variable's memory address. Non-addressable values cannot be modified indirectly, as attempting to access a struct field of a non-addressable value results in a compilation error.
To resolve this issue, there are two main approaches:
Using Pointer Values
One approach is to use a pointer value as the map value. This indirection makes the value addressable, allowing field modifications. Here's an example:
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 }
Value Copying or Replacement
Alternatively, you can work with non-addressable values by copying the value or replacing it entirely. Here are two examples:
// Value Copying dictionary["xxoo"] = pair{5.0, 5.0}
// Value Replacement p := dictionary["xxoo"] p.b = 5.0 dictionary["xxoo"] = p
Both of these approaches allow you to modify the "pair" struct within the map.
The above is the detailed content of How to Modify Struct Fields Within Go Map Values?. For more information, please follow other related articles on the PHP Chinese website!