channel
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是有发有收。
没有什么是写一万遍还不会的,如果有那就再写一万遍。

浙公网安备 33010602011771号