This commit is contained in:
Xargin
2016-10-05 13:42:01 +08:00
parent 5fd1e1d48f
commit f2df739842
6 changed files with 19 additions and 19 deletions

View File

@@ -1,6 +1,6 @@
### 8.4.3. 单方向的Channel
随着程序的增长人们习惯于将大的函数拆分为小的函数。我们前面的例子中使用了三个goroutine然后用两个channels连接它们它们都是main函数的局部变量。将三个goroutine拆分为以下三个函数是自然的想法
随着程序的增长人们习惯于将大的函数拆分为小的函数。我们前面的例子中使用了三个goroutine然后用两个channels连接它们它们都是main函数的局部变量。将三个goroutine拆分为以下三个函数是自然的想法
```Go
func counter(out chan int)
@@ -8,7 +8,7 @@ func squarer(out, in chan int)
func printer(in chan int)
```
其中squarer计算平方的函数在两个串联Channels的中间因此拥有两个channels类型的参数,一个用于输入一个用于输出。个channels都用有相同的类型但是它们的使用方式相反一个只用于接收另一个只用于发送。参数的名字in和out已经明确表示了这个意图但是并无法保证squarer函数向一个in参数对应的channels发送数据或者从一个out参数对应的channels接收数据。
其中计算平方的squarer函数在两个串联Channels的中间因此拥有两个channel类型的参数一个用于输入一个用于输出。个channel都拥有相同的类型但是它们的使用方式相反一个只用于接收另一个只用于发送。参数的名字in和out已经明确表示了这个意图但是并无法保证squarer函数向一个in参数对应的channel发送数据或者从一个out参数对应的channel接收数据。
这种场景是典型的。当一个channel作为一个函数参数时它一般总是被专门用于只发送或者只接收。
@@ -49,6 +49,6 @@ func main() {
}
```
调用counter(naturals)将导致将`chan int`类型的naturals隐式地转换为`chan<- int`类型只发送型的channel。调用printer(squares)也会导致相似的隐式转换,这一次是转换为`<-chan int`类型只接收型的channel。任何双向channel向单向channel变量的赋值操作都将导致该隐式转换。这里并没有反向转换的语法也就是不能一个类似`chan<- int`类型的单向型的channel转换为`chan int`类型的双向型的channel。
调用counter(naturals)将导致将`chan int`类型的naturals隐式地转换为`chan<- int`类型只发送型的channel。调用printer(squares)也会导致相似的隐式转换,这一次是转换为`<-chan int`类型只接收型的channel。任何双向channel向单向channel变量的赋值操作都将导致该隐式转换。这里并没有反向转换的语法也就是不能一个类似`chan<- int`类型的单向型的channel转换为`chan int`类型的双向型的channel。