同一个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的函数去检查可能出现的错误!
- 2 回答
- 0 关注
- 1561 浏览
添加回答
举报
0/150
提交
取消