这很有效。
var tick <-chan time.Time = time.Tick(1e8)
但是,这不是。
var tick chan time.Time = time.Tick(1e8)
为什么我的频道类型声明需要<-
?我认为<-
用于写入或读取频道。为什么它会出现在一个类型中?
答案 0 :(得分:19)
频道可以有一个类型,指示它是只读还是写,还是两者。
指示通道方向是使用&lt; - 作为类型的一部分或者为读/写通道省略的。
因此<-
中的<-chan time.Time
是该类型的一部分,
chan time.Time //Would be a read/writable channel
chan<- time.Time // Would be a write only channel
<-chan time.Time // Would be a read only channel
和time.Tick(1e8)
会返回一个只读频道。
阅读语言规范here
中的更多内容答案 1 :(得分:4)
考虑渠道的好方法是具有两端的管道。一端是事件流入的地方,另一端是流出的地方。所以声明一个频道,例如
var c = make(chan int)
创建一个整体的频道 - 即两端。相反,
func consume(c <-chan int) {
...
}
定义具有通道输入参数的函数 - 即通道的可读端,以及
func generate(c chan<- int) {
...
}
定义具有通道输出参数的函数 - 即通道的可写端。这两个函数都可以将整个通道作为实际参数传递,或者只传递它们所需的结束。
当通道用作局部变量或结构中的字段时,同样的一般原则适用。
尽可能使用通道结束语法是一种很好的做法,因为编译器可以更彻底地检查您编写的内容。
有趣的是,occam编程语言也有相同的语法来标记通道的哪一端是哪个。
答案 2 :(得分:0)
虽然您可以声明一个实际的“只读”或“只写”通道变量,但这样做是没用的,因为您无法对它们执行任何操作。
“只读”和“只写”语法用于函数参数。这种语法更像是C中的“const”或Ada中的“in”和“out”。
Go渠道也没有两个“目的”。 UNIX管道有两个文件描述符,每个描述符一个。通道类型的相同变量用于读取和写入。