按引用或值

如果我有以下结构的实例


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 位地址吗?


如果有人能指出一些更明显的规则,我会很高兴


隔江千里
浏览 185回答 3
3回答

慕田峪4524236

规则非常简单:Go 中没有“按引用传递/发送”的概念,你所能做的就是按值传递。关于是传递结构的值还是指向结构的指针的问题(这不是通过引用调用!):如果要修改函数或方法内部的值:传递一个指针。如果不想修改值:如果您的结构很大:使用指针。否则:没关系。所有这些考虑复制成本是多少都是在浪费时间。即使对于中等大小的结构,副本也很便宜。在分析之后传递一个指针可能是一个合适的优化。你的结构不大。一个大型结构包含像wholeWorldBuf [1000000]uint64. 像您这样的微小结构可能会或可能不会从传递指针中受益,而任何给出哪个更好的建议的人都在撒谎:这完全取决于您的代码和调用模式。如果您用尽了合理的选项,并且分析表明复制结构花费了时间:请尝试使用指针。

MYYA

大多数情况下,您应该使用按引用传递。像:func (n *Node) exampleFunc() {    ...}只有当您希望使用按值传递实例时,您才希望确保您的实例不受更改的影响。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go