Golang 编译时发送到零通道 [关闭]
Posted
技术标签:
【中文标题】Golang 编译时发送到零通道 [关闭]【英文标题】:Golang compiles with sends to nil channels [closed] 【发布时间】:2022-01-10 02:05:29 【问题描述】:我想知道 GoLang 是否应该在发送到 nil 的情况下编译和运行 渠道。一个例子是:
func main()
var ch chan string
var msg string
msg ="echo"
ch <-msg
msg = <-ch
编译但是应该编译,因为没有分配一个 nil 的通道。在执行之前您不会发现有问题,更糟糕的是,某些 IDE 不会告诉您这是一个问题。
【问题讨论】:
是的,Go 编译得很好。但是“在 nil 通道上发送永远阻塞”。见:go.dev/ref/spec#Send_statements 就像在 nil 频道 go.dev/ref/spec#Receive_operator 上接收一样。使用有效的频道,您的代码会死锁,因为没有准备好接收您使用ch <- msg
发送到频道的消息。
【参考方案1】:
通常在编译时无法检测到这一点。通道可以是函数的参数,传递什么值只能在运行时决定。
因此没有理由将其设为编译时错误。这可能是一个警告,但仅限于所有可能情况的一小部分。在某些情况下发出警告会产生误导,但并非在所有情况下都发出警告。当你没有看到警告时,你会得出错误的结论。更不用说使用/传递nil
频道有时可能是正确/预期的事情。
查看相关:How does a non initialized channel behave?
【讨论】:
以上是关于Golang 编译时发送到零通道 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池