值得一看
广告
彩虹云商城
广告

热门广告位

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语言免费学习笔记(深入)”;

图改改

图改改

在线修改图片文字

图改改455

查看详情
图改改

输出结果:

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

大家都在看:

Go语言中的信号与事件API设计:通道与Goroutine的妙用
Go语言中信号与事件API的设计模式
使用 Go 编译器默认使用 int64 类型
Go 语言中 int 类型的默认大小及使用建议
在 Go 中启动进程:使用 os/exec 包
温馨提示: 本文最后更新于2025-09-25 22:27:56,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容