为什么频道类型中包含'< - '?

时间:2012-12-27 21:37:18

标签: go

这很有效。

var tick <-chan time.Time = time.Tick(1e8)

但是,这不是。

var tick chan time.Time = time.Tick(1e8)

为什么我的频道类型声明需要<-?我认为<-用于写入或读取频道。为什么它会出现在一个类型中?

3 个答案:

答案 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管道有两个文件描述符,每个描述符一个。通道类型的相同变量用于读取和写入。