go基础知识-信道(channel)

1.channel:go特殊的数据类型,用于通信,使用的时候需要注意下结合使用不当容易造成死锁,在结合 for select 里使用break是没效果的

2.语法定义:  <-chan 读取, chan<-写入

    var chA = make(chan Type,len)//有缓冲

    var chB = make(chan Type)//无缓冲

从无缓冲的 channel 中读取消息会阻塞,直到有 goroutine 向该 channel 中发送消息;
同理,向无缓存的 channel 中发送消息也会阻塞,直到有 goroutine 从 channel 中读取消息

案例:

func main(){

var chA = make(chan int)
go func(chTemp <-chan int) {
for{
select {
//如果通道关闭则ok为false
case b,ok := <- chTemp:
if ok {
fmt.Println(b)
}else {
goto End
}
//default: //如果没有default字句,select将阻塞,直到某个通信可以运行
// fmt.Println("default")
}
}
End: fmt.Println("end")
}(chA)


//或者

//for v := range chA{
//   fmt.Println(v)
//}


go func(chTemp chan<- int){
for i:=0;i<10;i++ {
chTemp <- i
}
    close(chTemp)
}(chA)

time.Sleep(3 * 1e9)

}

结果输出:0,1,2,3,4,5,6,7,8,9

posted @   说好的你  阅读(304)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示