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 &lt;- msg 发送到频道的消息。 【参考方案1】:

通常在编译时无法检测到这一点。通道可以是函数的参数,传递什么值只能在运行时决定。

因此没有理由将其设为编译时错误。这可能是一个警告,但仅限于所有可能情况的一小部分。在某些情况下发出警告会产生误导,但并非在所有情况下都发出警告。当你没有看到警告时,你会得出错误的结论。更不用说使用/传递nil 频道有时可能是正确/预期的事情。

查看相关:How does a non initialized channel behave?

【讨论】:

以上是关于Golang 编译时发送到零通道 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池

Golang✔️走进 Go 语言✔️ 第十八课 通道关闭 & 工作池

Golang:无法在恢复()中向通道发送错误

结构中的 Golang 通道:传递给函数时可以是定向的吗?

如何测试通道是不是关闭并仅在未关闭时发送给它

接收器关闭并在尝试通过通道发送时返回 SendError