当前位置: 首页 > news >正文

Go 协程(Goroutine)入门与基础使用

一、什么是协程(Goroutine)?

简单来说,协程是由 Go 语言运行时管理的轻量级线程。相比系统线程,它的调度开销极小,内存占用非常少(默认只需 2KB 栈空间)。

你可以在一个程序中轻松创建成千上万个 goroutine,而不会像传统线程那样造成系统负担。

二、如何创建一个协程

只需要在函数调用前加上 go 关键字,Go 就会在新的协程中异步执行该函数:

package mainimport ("fmt""time"
)func sayHello() {fmt.Println("Hello from goroutine")
}func main() {go sayHello() // 启动一个新的协程time.Sleep(1 * time.Second) // 给协程执行的时间
}

如果不加 time.Sleep主线程可能直接退出,协程还没执行完,即不会输出"Hello from goroutine"。

三、多个协程并发执行

我们可以轻松开启多个任务同时运行:

package mainimport ("fmt""time"
)func main() {for i := 0; i < 5; i++ {go func(i int) {fmt.Printf("Worker %d is running\n", i)}(i)}time.Sleep(1 * time.Second)
}

输出顺序是不确定的,因为每个协程的调度是由 Go 运行时决定的。

四、协程与主线程的关系

主函数是 Go 程序的入口,也是主协程。一旦 main() 执行完毕,程序就退出,即使其他协程还在执行

为了解决这个问题,我们常用 sync.WaitGroup 等机制来等待所有协程结束:

package mainimport ("fmt""sync"
)var wg sync.WaitGroupfunc worker(id int) {defer wg.Done()fmt.Printf("Worker %d done\n", id)
}func main() {for i := 1; i <= 3; i++ {wg.Add(1)go worker(i)}wg.Wait() // 等待所有 goroutine 完成
}

五、goroutine 的注意事项

闭包中的变量捕获问题

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func() {time.Sleep(time.Second)fmt.Println(i)wg.Done()}()}wg.Wait() // 等待所有 goroutine 完成
}

正确做法是将变量作为参数传进去:

package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc main() {wg.Add(3)for i := 1; i <= 3; i++ {go func(val int) {time.Sleep(time.Second)fmt.Println(val)wg.Done()}(i)}wg.Wait() // 等待所有 goroutine 完成
}

http://www.xdnf.cn/news/976789.html

相关文章:

  • Go 的 fs 包(1/2):现代文件系统抽象
  • 零基础玩转物联网-串口转以太网模块如何快速实现与HTTP服务器通信
  • Solidity从入门到精通-函数及数据存储和作用域
  • 用 IRify 深入探索 WebShell 中的 Source/Sink 挖掘
  • AWS CloudFormation实战:构建可复用的ECS服务部署模板
  • AWS之混合云
  • 2025年渗透测试面试题总结-长亭科技[社招]应急响应工程师(题目+回答)
  • Roboguide工作站机器人重新安装软件包
  • 顶顶通电话机器人功能列表
  • 【前端面试】八、工程化
  • 如何顺利将电话号码转移到新iPhone?
  • 如何将文件从 iPhone 传输到闪存驱动器
  • App UI 设计中色彩搭配如何激发用户的深层情感
  • 算法第13天|继续学习二叉树:平衡二叉树(递归)、二叉树所有路径(递归)、左叶子之和(递归)
  • 基于 WebWorker 的 WebAssembly 图像处理吞吐量分析
  • Vue 事件绑定机制详解
  • 通过知识整合重新审视医学图像检索|文献速递-深度学习医疗AI最新文献
  • 基于uniapp实现自定义日历页面、年份月份选择、动态日历渲染、日期标记及备忘录、无组件依赖、多端兼容
  • 微信小程序中wxs
  • 增强现实—Where am I? Cross-View Geo-localization with Natural Language Descriptions
  • 记录rust滥用lazy_static导致的一个bug
  • Android 应用被kill问题排查和处理
  • 【DeepSeek×Draw.io 轻松构建UML】智能协作,高效建模
  • UE5 学习系列(八)材质基础认知
  • WPP 媒体推出基于人工智能的工具突破基于身份识别的定向模式
  • Idea 2025 commit 关闭侧边栏 开启探框
  • web程序设计期末复习-填空题
  • SLAM3R:基于单目视频的实时密集3D场景重建
  • uniapp 页面栈一定深度后,回首页导航到新页面的解决方案
  • 量子加速器切入 AI 底层架构!能源焦虑时代,ORCA 正在改写数据中心的计算逻辑