首页  >  文章  >  后端开发  >  为什么我不能在 Go 中获取映射值的地址?

为什么我不能在 Go 中获取映射值的地址?

Linda Hamilton
Linda Hamilton原创
2024-11-16 07:24:02438浏览

Why can't I take the address of a map value in Go?

在 Go 中获取映射值的地址

问题:为什么我不能获取映射值?

背景:

Go 编程语言限制使用“&”运算符来获取映射值的地址。此行为与切片值不同,切片值可以使用“&”来解决。

误解的澄清:

与映射由内存结构支持的信念相反与数组一样,它们实际上存储在动态的、重组的存储桶结构中。这意味着映射值没有固定的内存位置。

根本原因:

Go 禁止获取映射值的地址的主要原因是地图数据结构的动态性质。当创建、更新或删除映射条目时,可以重新组织存储桶以优化性能和内存使用。如果地图值允许使用地址,则它们将在这些重定位过程中失效。

地图中的数字修改:

尽管“ ”和“ =”等运算符可以用于就地修改数字映射值,这种简写形式实际上执行一系列不直接访问底层值的操作。

示例:

func icandothis() {
    cmap := make(map[int]complex64)
    cmap[1] += complex(1, 0)
    fmt.Println(cmap[1])
}

展开简写形式可以发现该操作实际上创建了一个新的临时值来执行加法并将其存储回映射中:

func icandothis() {
    cmap := make(map[int]complex64)
    v := cmap[1]
    v += complex(1, 0)
    cmap[1] = v
    fmt.Println(cmap[1])
}

修改映射中的结构值:

与数值不同,修改映射中的结构体值需要以下步骤:

  1. 从映射中检索结构体值。
  2. 修改结构体值。
  3. 将修改后的结构体值存储回映射中。

示例:

type Complex struct {
    R float32
    I float32
}

func (x *Complex) Add(c Complex) {
    x.R += c.R
    x.I += c.I
}

func main() {
    cmap := make(map[int]Complex)
    c := cmap[1]
    c.Add(Complex{1, 0})
    cmap[1] = c
    fmt.Println(cmap[1])
}

按照以下步骤,可以在以下位置修改结构体值: -地点,无需地址。

以上是为什么我不能在 Go 中获取映射值的地址?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn