回到简体

This commit is contained in:
chai2010
2016-02-15 11:06:34 +08:00
parent 9e878f9944
commit 2b37b23285
177 changed files with 2354 additions and 2354 deletions

View File

@@ -1,6 +1,6 @@
### 8.4.3. 方向的Channel
### 8.4.3. 方向的Channel
着程序的增,人們習慣於將大的函拆分小的函。我前面的例子中使用了三goroutine後用兩個channels連鏈接它,它都是main函的局部量。將三個goroutine拆分以下三個函數是自然的想法:
着程序的增,人们习惯于将大的函拆分小的函。我前面的例子中使用了三goroutine后用两个channels连链接它,它都是main函的局部量。将三个goroutine拆分以下三个函数是自然的想法:
```Go
func counter(out chan int)
@@ -8,15 +8,15 @@ func squarer(out, in chan int)
func printer(in chan int)
```
其中squarer算平方的函數在兩個串聯Channels的中,因此擁有兩個channels型的參數,一個用於輸入一個用於輸出。每channels都用有相同的型,但是它的使用方式想反:一個隻用於接收,另一個隻用於發送。參數的名字in和out已經明確表示了這個意圖,但是併無法保squarer函向一in參數對應的channels發送數據或者從一個out參數對應的channels接收數據
其中squarer算平方的函数在两个串联Channels的中,因此拥有两个channels型的参数,一个用于输入一个用于输出。每channels都用有相同的型,但是它的使用方式想反:一个只用于接收,另一个只用于发送。参数的名字in和out已经明确表示了这个意图,但是并无法保squarer函向一in参数对应的channels发送数据或者从一个out参数对应的channels接收数据
這種場景是典型的。當一個channel作爲一個函數參數是,它一般是被專門用於隻發送或者接收。
这种场景是典型的。当一个channel作为一个函数参数是,它一般是被专门用于只发送或者接收。
了表明這種意圖併防止被Go言的類型繫統提供了方向的channel型,分别用於隻發送或接收的channel。`chan<- int`表示一個隻發送int的channel隻能發送不能接收。相反,`<-chan int`表示一個隻接收int的channel能接收不能送。(箭`<-`關鍵字chan的相位置表明了channel的方向。這種限製將在編譯期檢測
了表明这种意图并防止被Go言的类型系统提供了方向的channel型,分别用于只发送或接收的channel。`chan<- int`表示一个只发送int的channel只能发送不能接收。相反,`<-chan int`表示一个只接收int的channel能接收不能送。(箭`<-`关键字chan的相位置表明了channel的方向。这种限制将在编译期检测
爲關閉操作隻用於斷言不再向channel送新的數據,所以有在送者所在的goroutine才會調用close函,因此對一個隻接收的channel調用close是一個編譯錯誤
为关闭操作只用于断言不再向channel送新的数据,所以有在送者所在的goroutine才会调用close函,因此对一个只接收的channel用close是一个编译错误
是改的版本,一次參數使用了方向channel型:
是改的版本,一次参数使用了方向channel型:
<u><i>gopl.io/ch8/pipeline3</i></u>
```Go
@@ -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。