<p>If I change a map field of a struct in a method, should I use a pointer or a non-pointer receiver?</p>
<pre><code>type Bot struct {
Callbacks map[string]func()
}
func NewBot() Bot {
return Bot{
Callbacks: make(map[string]func()),
}
}
func (bot Bot) On(event string, callback func()) {
bot.Callbacks[event] = callback
}
</code></pre>
<p>If I use a pointer receiver, then I should change all methods to use pointers right? Thanks for help.</p>
<hr/>**评论:**<br/><br/>Bake_Jailey: <pre><p>It won't matter. Maps are already reference types, just pointers to some header and data elsewhere in memory. If you wanted to reassign the map to a completely different map, then you'd have to use a pointer receiver.</p>
<p>That being said, you may end up needing a mutex for that map, which may require you to use a pointer receiver depending on if you choose to put the mutex or a pointer to the mutex in the struct. I would personally put the mutex in the struct (zero value), then use a pointer receiver.</p></pre>frodsan: <pre><p>Thanks for response. Do I need to use a mutex when I plan to use the method on the main function?</p>
<pre><code>func main() {
bot := NewBot()
bot.on("message", func() {
// ....
})
}
</code></pre></pre>basically_asleep: <pre><p>Not if you just use it like that. Only if you plan to use it from multiple goroutines.</p></pre>jerf: <pre><p>You can be even more specific, as far as I know. It's only if you plan on reading and writing from multiple goroutines simultaneously. I fairly frequently have a map that I construct in one goroutine, then "freeze", which means it can be read by anybody freely but they can't write to it safely. (Generally a good idea to use private methods here rather than making the map public, to help enforce that.)</p></pre>
这是一个分享于 的资源,其中的信息可能已经有所发展或是发生改变。
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传