go版本go version go1.11.2 linux/amd64无缓冲通道测试样例package mainimport “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 0naturals end 0naturals start 1squares start 0squares end 0squares start 1naturals end 1naturals start 2main 0main 1squares end 1squares start 2squares end 2main 2naturals end 2naturals start 3naturals end 3naturals start 4squares start 3squares end 3squares start 4naturals end 4naturals start 5main 3main 4squares end 4squares start 5squares end 5main 5naturals end 5naturals start 6naturals end 6naturals start 7squares start 6squares end 6squares start 7naturals end 7naturals start 8main 6main 7squares end 7squares start 8squares end 8main 8naturals end 8naturals start 9naturals end 9naturals close squares start 9squares end 9squares close main 9总结重点是开头的naturals start 0naturals end 0naturals start 1squares start 0无缓冲通道可以塞进一个信息,然后继续往下走,如果这个信息还没有接收,继续发送消息,则会造成阻塞,会切换到另外一个goroutine有缓冲通道测试样例package mainimport “fmt"func main(){naturals:=make(chan int,1)//有缓存通道 容量为1squares:=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 0naturals end 0naturals start 1naturals end 1naturals start 2squares start 0squares end 0squares start 1naturals end 2naturals start 3main 0main 1squares end 1squares start 2squares end 2squares start 3main 2main 3squares end 3naturals end 3naturals start 4naturals end 4naturals start 5naturals end 5naturals start 6squares start 4squares end 4squares start 5naturals end 6naturals start 7main 4main 5squares end 5squares start 6squares end 6squares start 7main 6main 7squares end 7naturals end 7naturals start 8naturals end 8naturals start 9naturals end 9naturals close squares start 8squares end 8squares start 9main 8main 9squares end 9squares close 总结重点是开头的naturals start 0naturals end 0naturals start 1naturals end 1naturals start 2squares start 0容量为1的有缓冲通道可以塞进2个信息,然后继续往下走,如果这2个信息还没有接收,继续发送消息,则会造成阻塞,会切换到另外一个goroutine