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

golang中channel如何在多个goroutine中优雅(安全)的send

golang中channel如何在多个goroutine中优雅(安全)的send

Go
凤凰求蛊 2018-10-02 19:12:29
同一个channel, 我需要在多个goroutine中send, 在一个goroutine中receive, 并且我可以随时关闭这个channel, 问题是如果我关闭channel后还有send, 就会导致一个panic.网上找到的一个方法是panic后再recoverfunc SafeSend(ch chan T, value T) (closed bool) {    defer func() {        if recover() != nil {            // the return result can be altered             // in a defer function call            closed = true        }    }()    ch <- value // panic if ch is closed    return false // <=> closed = false; return}因为不想用recover,问一下还有没有更加优雅的方式去实现
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

同一个channel, 需要在多个goroutine中send的话应该用缓冲区chan。

recover是尽量不用的,因此,应该在sender之前就做判断

题主应该是之前用过一段时间的其他语言,并且接触go不久,因此在错误处理的思路上,还不太符合go的特点。

与大多数语言不同,用try...catch...等机制来做错误处理,go建议大家不要轻易使用recover,而是用返回err对象来处理。因此,在可能出现panic的语句之前,尽量用能够返回err的函数去检查可能出现的错误!


查看完整回答
反对 回复 2018-10-14
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

通过一个chan来通知这些生产者退出,用WaitGroup等待这些生产者退出,最后关闭这个主chan

查看完整回答
反对 回复 2018-10-14
  • 2 回答
  • 0 关注
  • 1500 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信