Go语言中修改Map Value的“原地”操作

Go语言中修改Map Value的“原地”操作

go语言中,map是一种常用的数据结构,用于存储键值对。然而,由于Go语言的map实现机制,直接修改map value的值并不像修改slice或数组中的元素那样直接。 简单来说,直接对 map[key] 返回的值进行修改,实际上修改的是值的拷贝,而不是map中存储的原始值。 因此,需要采用一些技巧来实现对map value的“原地”修改。

使用指针作为Map Value

一种常见的解决方案是将map的value类型设置为指针。这样,map中存储的是指向实际值的指针,而不是值的拷贝。通过修改指针指向的值,就可以实现对map value的间接修改。

以下是一个示例代码:

package main  import "fmt"  type A struct {     Things map[string]*str }  type str struct {     s string }  func (a A) ThingWithKey(key string) *str {     return a.Things[key] }  func main() {     variable := A{}      variable.Things = make(map[string]*str)     variable.Things["first"] = &str{s: "first test"}      firstTest := variable.ThingWithKey("first")     firstTest.s = "second test"      fmt.Println(firstTest.s)     fmt.Println(variable.ThingWithKey("first").s) }

在这个例子中,A.Things 的类型是 map[string]*str,这意味着map的value是指向 str 结构体的指针。 当执行 firstTest.s = “second test” 时,实际上修改了指针 firstTest 指向的 str 结构体的 s 字段的值。 由于 variable.Things[“first”] 也指向同一个 str 结构体,因此 variable.ThingWithKey(“first”).s 的值也会被修改。

立即学习go语言免费学习笔记(深入)”;

Go语言中修改Map Value的“原地”操作

图改改

在线修改图片文字

Go语言中修改Map Value的“原地”操作455

查看详情 Go语言中修改Map Value的“原地”操作

输出结果:

second test second test

代码解释

  1. 定义结构体 str: 定义了一个包含字符串字段 s 的结构体。
  2. 定义结构体 A: 定义了一个包含 Things 字段的结构体,Things 是一个 map[string]*str 类型的map。
  3. 创建 A 的实例: 创建了一个 A 类型的实例 variable。
  4. 初始化 Things map: 使用 make(map[string]*str) 初始化 variable.Things map。
  5. 添加键值对: 向 variable.Things map 中添加一个键值对,其中键是 “first”,值是指向 str{s: “first test”} 结构体的指针。 注意这里使用 & 符号获取结构体的指针。
  6. 获取指针: 通过 variable.ThingWithKey(“first”) 获取键 “first” 对应的 str 结构体的指针。
  7. 修改指针指向的值: 通过 firstTest.s = “second test” 修改指针 firstTest 指向的 str 结构体的 s 字段的值。
  8. 验证修改结果: 分别打印 firstTest.s 和 variable.ThingWithKey(“first”).s 的值,可以看到它们都被修改为 “second test”。

注意事项

  • 使用指针作为map value时,需要注意空指针异常。 在访问map value之前,应该先检查指针是否为 nil。
  • 当多个goroutine同时访问和修改同一个map时,需要使用锁机制来保证线程安全。
  • 这种方法适用于需要修改map value内部字段的情况。 如果需要替换整个map value,可以直接使用 map[key] = newValue 的方式。

总结

通过将map value设置为指针类型,可以实现对map value的间接修改。 这种方法在某些场景下非常有用,但需要注意空指针异常和线程安全问题。 在选择使用这种方法时,需要根据实际情况进行权衡。

go go语言 ai 键值对 String 字符串 结构体 指针 数据结构 指针类型 线程 Go语言 空指针 nil map

上一篇
下一篇
text=ZqhQzanResources