go version go1.11.2 linux/amd64linux
package main import "fmt" func main(){ naturals:=make(chan int,0)//無緩存通道 squares:=make(chan int) go func(){ for x:=0;x<10;x++{ fmt.Println("naturals start ",x) naturals<-x fmt.Println("naturals end ",x) } fmt.Println("naturals close ") close(naturals) }() go func(){ for x:=range naturals{ fmt.Println("squares start ",x) squares<-x fmt.Println("squares end ",x) } fmt.Println("squares close ") close(squares) }() for x:=range squares{ fmt.Println("main ",x) } }
naturals start 0 naturals end 0 naturals start 1 squares start 0 squares end 0 squares start 1 naturals end 1 naturals start 2 main 0 main 1 squares end 1 squares start 2 squares end 2 main 2 naturals end 2 naturals start 3 naturals end 3 naturals start 4 squares start 3 squares end 3 squares start 4 naturals end 4 naturals start 5 main 3 main 4 squares end 4 squares start 5 squares end 5 main 5 naturals end 5 naturals start 6 naturals end 6 naturals start 7 squares start 6 squares end 6 squares start 7 naturals end 7 naturals start 8 main 6 main 7 squares end 7 squares start 8 squares end 8 main 8 naturals end 8 naturals start 9 naturals end 9 naturals close squares start 9 squares end 9 squares close main 9
重點是開頭的緩存
naturals start 0 naturals end 0 naturals start 1 squares start 0
無緩衝通道能夠塞進一個信息,而後繼續往下走,
若是這個信息尚未接收,繼續發送消息,則會形成阻塞,會切換到另一個goroutinebash
package main import "fmt" func main(){ naturals:=make(chan int,1)//有緩存通道 容量爲1 squares:=make(chan int) go func(){ for x:=0;x<10;x++{ fmt.Println("naturals start ",x) naturals<-x fmt.Println("naturals end ",x) } fmt.Println("naturals close ") close(naturals) }() go func(){ for x:=range naturals{ fmt.Println("squares start ",x) squares<-x fmt.Println("squares end ",x) } fmt.Println("squares close ") close(squares) }() for x:=range squares{ fmt.Println("main ",x) } }
naturals start 0 naturals end 0 naturals start 1 naturals end 1 naturals start 2 squares start 0 squares end 0 squares start 1 naturals end 2 naturals start 3 main 0 main 1 squares end 1 squares start 2 squares end 2 squares start 3 main 2 main 3 squares end 3 naturals end 3 naturals start 4 naturals end 4 naturals start 5 naturals end 5 naturals start 6 squares start 4 squares end 4 squares start 5 naturals end 6 naturals start 7 main 4 main 5 squares end 5 squares start 6 squares end 6 squares start 7 main 6 main 7 squares end 7 naturals end 7 naturals start 8 naturals end 8 naturals start 9 naturals end 9 naturals close squares start 8 squares end 8 squares start 9 main 8 main 9 squares end 9 squares close
重點是開頭的測試
naturals start 0 naturals end 0 naturals start 1 naturals end 1 naturals start 2 squares start 0
容量爲1的有緩衝通道能夠塞進2個信息,而後繼續往下走,
若是這2個信息尚未接收,繼續發送消息,則會形成阻塞,會切換到另一個goroutinecode