我想知道这个着名的引言最真实的解释是什么:
不要通过共享内存进行通信; 通过沟通分享记忆.(R. Pike)
在Go Go Memory Model中,我可以读到:
通道上的发送在该通道的相应接收完成之前发生.(Golang Spec)
还有一篇专门的golang文章解释了这句话.而关键的贡献也是Andrew G.的一个实例.
好.有时太多谈论....我从Memory Spec报价中得出,并且通过查看工作示例:
在goroutine1通过通道向goroutine2发送(任何内容)后,goroutine1完成的所有更改(内存中的任何位置)必须在通过相同通道接收到goroutine2后才可见.(Golang Lemma by Me :)
因此,我得出了着名引言的脚踏实地的解释:
要同步两个goroutine之间的内存访问,您不需要通过通道发送该内存.足够好的是从频道接收(甚至没有).您将看到goroutine发送(到频道)时发送的任何更改(在任何地方).(当然,假设没有其他goroutine写入相同的内存.)更新(2)8-26-2017
我实际上有两个问题:
1)我的结论是否正确?
2)我的解释有帮助吗?
更新(1) 我假设没有缓冲的频道.让我们首先限制自己,避免用太多的未知数来改造自己.
请注意,我们还要关注两个goroutine的简单用法,这两个goroutines通过单个通道和相关的记忆效应进行通信而不是最佳实践 - 这超出了本问题的范围.
为了更好地理解我的问题的范围,假设goroutine可以访问任何类型的内存结构 - 不仅是原始的 - 并且它可以是一个大的,它可以是字符串,映射,数组,等等.