03-携程同步
1.01-包引用和引用顺序2.02-运算符号、标识符、注释、关键字3.03-变量和作用域4.02-常量(const)5.03-数组(array)6.04-切片(slice)7.05-map8.06-指针(pointer)9.07-通道(channel)10.08-结构体(struct)11.01-if语句12.02-for循环13.04-select语句14.03-switch语句15.make()、new()16.copy(切片间复制)17.append(增加切片成员)18.delete(删除map的成员)19.panic&recover20.03-匿名函数和闭包21.01-函数简单使用22.02-形参和实参23.04-递归函数24.05-方法25.06-接口(interface)26.01-并发27.02-携程通讯
28.03-携程同步
29.01-连接和建表30.02-创建数据31.03-基本查询32.04-高级查询33.05-初始化34.06-更新数据35.07-删除数据36.08 事务37.根据操作系统程序自动选择不同常量38.golang字串的base64编码解码39.golang数据类型转换40.golang 时间/时间戳的获取和转换1. 代码结构
2 gorotine.go
package gorotine import ( "fmt" "sync" "time" ) //定义WG,用sync中的函数来同步数据 var WG sync.WaitGroup func Read() { for i :=0 ; i<=10 ; i++ { WG.Add(1) } } func Write() { for i :=0 ; i <= 10 ; i++ { time.Sleep(time.Second * 1) fmt.Println("Done >",i) WG.Done() } }
说明:
Add(n)
把计数器设置为n
Done()
每次把计数器-1
wait()
会阻塞代码的运行,直到计数器地值减为0
以上可知:
如果我把n 设置成2,那么我在下文main.go中可以打开两个协程执行WG.Write()
如果我把n仍设置成1,而在main.go中坚持打开两个协程执行WG.Write()
,那写到5就报错了。除非我把Write()中的循环条件写成i=0;i<=21;i++
3 main.go
package main import ( "814/gorotine" "fmt" "time" ) func main () { //主线程来读(上文可知,此时WG的计数器被设置为1) gorotine.Read() //开启一个协程来写(写完后计数器被-1,为0) go gorotine.Write() //主线程等待协程写完(阻塞代码,知道计数器为0) gorotine.WG.Wait() //协程写完后主线程打印一个标记 fmt.Println("All dome") //主线程等两秒后退出 time.Sleep(time.Second * 2 ) }
4. 输出
Done > 0 Done > 1 Done > 2 Done > 3 Done > 4 Done > 5 Done > 6 Done > 7 Done > 8 Done > 9 Done > 10 All dome Process finished with the exit code 0
分类:
go语言开发 / go基础
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?