猿问

为什么 Go 使用通道在 goroutine 之间发送和接收数据,而不是使用正态变量?

除了维基百科 https://en.wikipedia.org/wiki/Channel_(编程)的解释之外,我找不到有关这个问题的任何信息。但我对解释不满意。

渠道解决了什么问题?我们为什么不直接使用普通变量来发送和接收数据呢?


心有法竹
浏览 113回答 2
2回答

UYOU

例如,如果“正常变量”是指多个 goroutine 写入和读取的切片,那么这是获取数据竞赛的有保证的方法(您不想获得数据竞赛)。您可以通过使用某种同步(如互斥或 RWLock)来避免并发访问。此时,您重新发明的通道(基本上是互斥体下的切片)花费的时间比您需要的时间多,但您的解决方案仍然较差(没有语法支持,您无法在 中使用切片等)select

白板的微信

通道解决了并发读写的问题。基本上,防止一个戈鲁廷读取变量而另一个戈鲁廷写入相同变量的情况。此外,通道也可能具有缓冲区,因此您可以在锁定之前写入多个值。当然,您不必使用频道。还有其他方法可以在戈鲁丁之间发送数据。例如,可以在从共享变量中赋值或读取值时使用原子操作,或者在访问互斥锁时使用互斥锁。
随时随地看视频慕课网APP

相关分类

Go
我要回答