我正在学习Go,到目前为止对它印象深刻。我已经阅读了golang.org上的所有在线文档,并且在Chrisnall的“ The Go编程语言短语”中走了一半。我了解渠道的概念,并认为它们将非常有用。但是,我一定错过了一些重要的过程,因为我看不到单向通道的意义。
如果我正确地解释了它们,则只能在其上接收只读通道,而只能在其上传输只写通道,那么为什么有一个可以发送但从不接收的通道?可以将它们从一个“方向”投射到另一个“方向”吗?如果是这样,又没有实际约束又有什么意义呢?它们只是对渠道目的客户代码的提示吗?
可以将通道设置为对接收该通道的任何人都是只读的,而发送方仍然可以使用双向通道进行写入。例如:
func F() <-chan int { // Create a regular, two-way channel. c := make(chan int) go func() { defer close(c) // Do stuff c <- 123 }() // Returning it, implicitely converts it to read-only, // as per the function return value. return c }
呼叫的人F()都会收到一个只能阅读的频道。这对于避免在编译时潜在地滥用通道很有用。因为只读/只写通道是不同的类型,所以编译器可以使用其现有的类型检查机制来确保调用者不会尝试将内容写入没有业务写入的通道。
F()