登录
首页 >  Golang >  Go问答

Go中的映射是通过值传递还是指针传递来存储对象的?

来源:stackoverflow

时间:2024-03-09 21:33:32 451浏览 收藏

在Golang实战开发的过程中,我们经常会遇到一些这样那样的问题,然后要卡好半天,等问题解决了才发现原来一些细节知识点还是没有掌握好。今天golang学习网就整理分享《Go中的映射是通过值传递还是指针传递来存储对象的?》,聊聊,希望可以帮助到正在努力赚钱的你。

问题内容

我有以下地图:

var conns map[string]conn

如您所知,conn 是自定义类型。我的映射存储 conn 类型的值,如声明所示。 为了将它们存储在地图中,我这样做:

conns["127.0.0.1"] = Conn{}

但我的问题是,go 在幕后是否存储了指向 conn 对象的指针,或者它实际上存储了该值?


解决方案


structs 按值存储。访问 conns["127.0.0.1"] 将为您提供 conn 结构的副本

如果您尝试像这样修改结构,则 conns["127.0.0.1"] 处的结构将保持不变,直到您使用新修改的结构覆盖映射条目:

c := conns["127.0.0.1"]
c.x = y

// `c` now contains different content to `conns["127.0.0.1"]`!

// To ensure conns["127.0.0.1"] is updated, either overwrite or use a point.
conns["127.0.0.1"] = c // overwrite

这就是为什么当您修改结构时,映射中的结构保持不变,直到您用新结构覆盖映射条目。

相反,您可以存储指向该结构的指针。这允许直接修改结构。

因此,如果将 conns 的类型从 map[string]conn 更改为 map[string]*conn,则上述代码的前两行将更新映射中的结构。

更多信息可以在这里找到:https://www.ardanlabs.com/blog/2017/07/interface-semantics.html

本篇关于《Go中的映射是通过值传递还是指针传递来存储对象的?》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>