个人学习笔记不要看
package main
import (
"fmt"
)
func main() {
//构建一个通道
ch1 := make(chan int)
//开启一个匿名并发函数
go func() {
fmt.Println("start goroutine")
//通过通道通知main的goroutine
//这句代码会一直阻塞到main的goroutine接收为止
ch1 <- 0
fmt.Println("exit goroutine")
}()
//time.Sleep(3 * time.Second)
fmt.Println("wait goroutine")
//等待匿名goroutine
<- ch1
fmt.Println("all done")
}
并发执行,main的goroutine在发布启动协成任务后就只继续执行自己的,启动一个新的goroutine需要时间,所以先打印wait goroutine,如果main的goroutine睡眠一下就会打印start goroutine
package main
import (
"fmt"
"time"
)
/*
通道ch是可以进行遍历的
遍历的结果就是接收到的数据
for data := range ch{
}
通过for遍历获得的变量只有一个就是data
*/
func main() {
//构建一个通道
ch := make(chan int)
//开启一个并发匿名函数
go func() {
fmt.Println("start goroutine")
//从3循环到0
for i := 3; i >= 0 ; i-- {
//发送3到0之间的数值
ch <- i
//每次发送完之后等待
time.Sleep(time.Second)
}
fmt.Println("exit goroutine")
}()
//循环接收
for data := range ch {
fmt.Println(data)
//遇到数据0时,退出接收循环,如果遇到0不退出,此时通道中已经没有值的话就会触发宕机错误
if data == 0 {
break
}
}
}
并发执行,但是main的goroutine结束后,子goroutine都会结束
所以不会打印exit goroutine
本文来自博客园,作者:蹇爱黄,转载请注明原文链接:https://www.cnblogs.com/jianjiana/p/16916380.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?