channel
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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是有发有收。