Home > Backend Development > Golang > How to Modify Struct Fields Within Go Map Values?

How to Modify Struct Fields Within Go Map Values?

DDD
Release: 2024-11-28 19:51:11
Original
975 people have browsed it

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
}
Copy after login

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
}
Copy after login

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}
Copy after login
// Value Replacement
p := dictionary["xxoo"]
p.b = 5.0
dictionary["xxoo"] = p
Copy after login

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!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template