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

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

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

Go
心有法竹 2022-09-12 21:18:26
除了维基百科 https://en.wikipedia.org/wiki/Channel_(编程)的解释之外,我找不到有关这个问题的任何信息。但我对解释不满意。渠道解决了什么问题?我们为什么不直接使用普通变量来发送和接收数据呢?
查看完整描述

2 回答

?
UYOU

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

例如,如果“正常变量”是指多个 goroutine 写入和读取的切片,那么这是获取数据竞赛的有保证的方法(您不想获得数据竞赛)。您可以通过使用某种同步(如互斥或 RWLock)来避免并发访问。

此时,您

  1. 重新发明的通道(基本上是互斥体下的切片)

  2. 花费的时间比您需要的时间多,但您的解决方案仍然较差(没有语法支持,您无法在 中使用切片等)select


查看完整回答
反对 回复 2022-09-12
?
白板的微信

TA贡献1883条经验 获得超3个赞

通道解决了并发读写的问题。基本上,防止一个戈鲁廷读取变量而另一个戈鲁廷写入相同变量的情况。

此外,通道也可能具有缓冲区,因此您可以在锁定之前写入多个值。

当然,您不必使用频道。还有其他方法可以在戈鲁丁之间发送数据。例如,可以在从共享变量中赋值或读取值时使用原子操作,或者在访问互斥锁时使用互斥锁。


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 112 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号