是否有"制造"单向通道的目的?

Lin*_*ope 13 go

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

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

操场

当然,运行它会造成僵局.如果您使用%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()
}
Run Code Online (Sandbox Code Playgroud)

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

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

pet*_*rSO 4

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

你写了一些有效的废话:

package main

func main() {
    ch := make(chan<- int)
    ch <- 5
}
Run Code Online (Sandbox Code Playgroud)

下面是一些更有效的废话:

package main

func main() {
    for {
    }
}
Run Code Online (Sandbox Code Playgroud)