1.what‘s chanel?
信道是什么?简单说,是goroutine之间互相通讯的东西。类似我们Unix上的管道(可以在进程间传递消息), 用来goroutine之间发消息和接收消息。其实,就是在做goroutine之间的内存共。
2.hot to use?
example:
package main import ( "fmt" "time" ) func main() { a := make(chan int) go func(){ for i:=0; i<= 5; i++{ a<-i time.Sleep(time.Second * 1) } close(a) }() go func(){ for { select { case x, ok := <- a : if ok{ fmt.Println(x) time.Sleep(time.Second * 2) }else{ fmt.Println("over") return } } } }() time.Sleep(time.Second * 15) }
3.trouble shouting
1fatal error: all goroutines are asleep - deadlock!
package main import ( "fmt" "time" ) func main() { a := make(chan int) //go func(){ for i:=0; i<= 5; i++{ a<-i time.Sleep(time.Second * 1) } close(a) //}() go func(){ for { select { case x, ok := <- a : if ok{ fmt.Println(x) time.Sleep(time.Second * 2) }else{ fmt.Println("over") return } } } }() time.Sleep(time.Second * 15) }
a 为非缓冲的channel,在main方法的主线程中输入第一个数据的时候,channe阻塞,直接挂起。导致程序无法进行下去。然后报错。
正确的使用channel是有发有收。