女同事问了一个 golang 的技术问题,没答上来,溴大了

2021-04-27 16:26:27 +08:00
 nmap

两个 goroutine:go1,go2
go1 从 socket 读,读到的数据写到 ch1
go2 从 ch2 读,读到的数据写到 socket
以此来实现全双工通信

问题:ch1 关闭之后,go1 不知道,一写就崩了,怎么避免?

5916 次点击
所在节点    Go 编程语言
25 条回复
shakeyo
2021-04-27 16:35:39 +08:00
创建一个用于通知的 chan
for 循环里监听这个 chan 是否有消息
在关闭的时候写入
在读取的时候监听
有信号退出当前 channel 就行
bfdh
2021-04-27 16:40:34 +08:00
溴 ( xiù ) (英語:Bromine )是一種化學元素,其化學符號为 Br,原子序數为 35 —— 摘自维基百科
hwdef
2021-04-27 16:41:31 +08:00
从 ch 读的时候,可以检查是否已关闭了。
brader
2021-04-27 16:43:28 +08:00
这确实是个问题,需要今晚好好研究下
masterclock
2021-04-27 16:47:10 +08:00
chan 仅由写的一方关闭
bruce00
2021-04-27 16:48:32 +08:00
[How to Gracefully Close Channels]( https://go101.org/article/channel-closing.html)

```go
func SafeSend(ch chan T, value T) (closed bool) {
defer func() {
if recover() != nil {
closed = true
}
}()

ch <- value // panic if ch is closed
return false // <=> closed = false; return
}
```
keepeye
2021-04-27 16:48:53 +08:00
ch1 由 go1 关闭,也就是永远由写的一方关闭 channel
lbingl
2021-04-27 16:49:50 +08:00
糗 qiǔ,溴 xiù
juzisang
2021-04-27 16:52:23 +08:00
秀大了
linvon
2021-04-27 16:53:06 +08:00
go1 来关闭啊,怎么可能由消费者去关闭通道
go2 用 for range 去读,也能感知到关闭
echo1937
2021-04-27 16:54:10 +08:00
你打标题的时候,又糗大了了一次。
Latin
2021-04-27 16:58:14 +08:00
我怀疑你是套娃 给自己问问题
name1991
2021-04-27 17:13:56 +08:00
女同事很会发现问题
Presbyter
2021-04-27 17:16:52 +08:00
可以考虑用 context Cancel 控制一下
go1(ctx){
...
select{
case <-ctx.Done():
return
......
}
.....
}
SmartKeyerror
2021-04-27 17:19:21 +08:00
The close built-in function closes a channel, which must be either bidirectional or send-only. It should be executed only by the sender, never the receiver, and has the effect of shutting down the channel after the last sent value is received.

https://pkg.go.dev/builtin#close
yogogo
2021-04-27 17:19:25 +08:00
娶回家
lasuar
2021-04-27 17:22:56 +08:00
5 楼就是答案
zhaohua
2021-04-27 17:49:14 +08:00
如果把问题简化为: 从关闭的 ch 中读取数据,如何才能不崩溃,答案是:做不到.
emeab
2021-04-27 18:05:35 +08:00
你又可以发一贴 在 V2EX 发帖 认错字了 糗大了
Vegetable
2021-04-28 09:54:35 +08:00
没人提但是我很好奇,panic 了就 recover 一下不也算方案吗

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/773635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX