在 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]) }
修改映射中的结构值:
与数值不同,修改映射中的结构体值需要以下步骤:
示例:
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中文网其他相关文章!