为了账号安全,请及时绑定邮箱和手机立即绑定

按引用或值

按引用或值

Go
隔江千里 2021-08-10 15:59:09
如果我有以下结构的实例type Node struct {    id          string     name        string      address     string    conn        net.Conn    enc         json.Encoder    dec         json.Decoder    in          chan *Command    out         chan *Command    clients     map[string]ClientNodesContainer}我不明白什么时候应该通过引用发送结构,什么时候应该通过值发送它(考虑到我不想对该实例进行任何更改),是否有一个更容易决定的经验法则?我能找到的只是在复制小或便宜时按值发送一个结构,但是例如,小真的意味着小于 64 位地址吗?如果有人能指出一些更明显的规则,我会很高兴
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

规则非常简单:

Go 中没有“按引用传递/发送”的概念,你所能做的就是按值传递。

关于是传递结构的值还是指向结构的指针的问题(这不是通过引用调用!):

  1. 如果要修改函数或方法内部的值:传递一个指针。

  2. 如果不想修改值:

    1. 如果您的结构很大:使用指针。

    2. 否则:没关系。

所有这些考虑复制成本是多少都是在浪费时间。即使对于中等大小的结构,副本也很便宜。分析之后传递一个指针可能是一个合适的优化。

你的结构不大。一个大型结构包含像wholeWorldBuf [1000000]uint64. 像您这样的微小结构可能会或可能不会从传递指针中受益,而任何给出哪个更好的建议的人都在撒谎:这完全取决于您的代码和调用模式。

如果您用尽了合理的选项,并且分析表明复制结构花费了时间:请尝试使用指针。


查看完整回答
反对 回复 2021-08-10
?
MYYA

TA贡献1868条经验 获得超4个赞

大多数情况下,您应该使用按引用传递。像:


func (n *Node) exampleFunc() {

    ...

}

只有当您希望使用按值传递实例时,您才希望确保您的实例不受更改的影响。


查看完整回答
反对 回复 2021-08-10
  • 3 回答
  • 0 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信