首页 > 后端开发 > Golang > 如何修改 Go Map 值中的结构体字段?

如何修改 Go Map 值中的结构体字段?

DDD
发布: 2024-11-28 19:51:11
原创
929 人浏览过

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中的一个基本概念,它指的是定位变量内存地址的能力。无法间接修改不可寻址值,因为尝试访问不可寻址值的结构体字段会导致编译错误。

要解决此问题,主要有两种方法:

使用指针值

一种方法是使用指针值作为映射值。这种间接寻址使得值可寻址,从而允许字段修改。下面是一个示例:

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
dictionary["xxoo"] = pair{5.0, 5.0}
登录后复制
// Value Replacement
p := dictionary["xxoo"]
p.b = 5.0
dictionary["xxoo"] = p
登录后复制

这两种方法都允许您修改映射中的“pair”结构。

以上是如何修改 Go Map 值中的结构体字段?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板