"制作单向频道是否有目的?

时间:2015-07-06 07:15:02

标签: go

注意:这不是this问题的重复,因为我知道何时使用单向通道。我一直这样做。我的问题是为什么这个程序是有效的:

func main() {
    ch := make(chan<- int)
    ch <- 5
    fmt.Println("Hello, playground")
}

Playground

运行它当然会造成僵局。如果您使用%T检查类型,则Go确实报告ch的类型是仅发送通道。在Go中,您被允许make单向频道,但这没有多大意义,因为通过创建一个仅在单向启动的频道,您可以确保至少有一个读/写永远不会发生。

可能的解释是强制goroutine挂起,但这与select {}一样容易实现。

我唯一的另一个想法是强迫goroutine只做n次的事情,

ch := make(chan<- int, 50)
// do something 50 times, since then the buffer is full
for {
  ch <- doSomething()
}

但是,通过任意数量的不同结构,这更容易,更不用说容易混淆了。

这只是对类型系统的怪癖/疏忽,还是我没有想到这种行为?

1 个答案:

答案 0 :(得分:3)

你有一种语言:单词(标记)和语法。你总是可以写出有效的废话:蓝色不是一种颜色。

你写了一些有效的废话:

package main

func main() {
    ch := make(chan<- int)
    ch <- 5
}

这里有一些更有效的废话:

package main

func main() {
    for {
    }
}