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