注意:这不是this问题的重复,因为我知道何时使用单向通道。我一直这样做。我的问题是为什么这个程序是有效的:
func main() {
ch := make(chan<- int)
ch <- 5
fmt.Println("Hello, 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()
}
但是,通过任意数量的不同结构,这更容易,更不用说容易混淆了。
这只是对类型系统的怪癖/疏忽,还是我没有想到这种行为?
答案 0 :(得分:3)
你有一种语言:单词(标记)和语法。你总是可以写出有效的废话:蓝色不是一种颜色。
你写了一些有效的废话:
package main
func main() {
ch := make(chan<- int)
ch <- 5
}
这里有一些更有效的废话:
package main
func main() {
for {
}
}