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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?