Channel的中文應該就叫做通道,可以用來Send和Receive資料,使用起來頗抽象,我也是第一次接觸這種概念。似乎在Goroutine實作時會常常見到他?
這邊又要請到我們的make
好幫手,channel也是有型別的!
c := make(chan int)
要將東西送到channel就把資料指向channel變數就好了
c <- 5
就將箭頭往外指
x := <-c
當Channel被Close之後,就只能讀取不能寫入了
close(c)
channel其實就是一個變數,在function裡是可以傳入傳出的
func foo(c chan int) {
// do something
}
func foo() {
// do something
}
因為這東西我個人覺得太抽象了,講幾個範例可能會比較容易懂
package main
import (
"fmt"
)
func main() {
c := make(chan int)
// 在goroutine之下執行這個function
go func() {
for i := 0; i < 10; i++ {
c <- i
}
close(c)
}()
for n := range c {
fmt.Println(n)
}
}
在這裡go func()將i傳入c,下面的for會等待c有什麼時候有新東西,一有新東西他就會print出來
package main
import (
"fmt"
)
func main() {
c := make(chan int)
done := make(chan bool)
go func() {
for i := 0; i < 10; i++ {
c <- i
}
done <- true
}()
go func() {
for i := 0; i < 10; i++ {
c <- i
}
done <- true
}()
go func() {
<-done
<-done
close(c)
}()
for n := range c {
fmt.Println(n)
}
}
這個範例是要示範如何將資料從Channel Send出去(<-done
),要注意的是send出去的同時資料也會在channel裡面刪除,所以要確定使用send的情況是有資料可以send的,要不然就會一直等待有東西可以send,因此卡在send那行