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

Go语言-->Goroutine 详细解释

Goroutine 详细解释

goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理。它是实现并发编程的核心机制。

核心概念

特性说明
轻量级创建成本极低,一个程序可以轻松创建数百万个 goroutine
并发执行多个 goroutine 可以同时运行
由运行时管理Go 运行时自动调度 goroutine 到 CPU 核心上
非抢占式goroutine 只在特定点(如 I/O、channel 操作)让出控制权

基本用法

1. 创建 Goroutine

package mainimport ("fmt""time"
)func main() {// 普通函数调用(同步)sayHello("Alice")// 启动 goroutine(异步)go sayHello("Bob")// 主 goroutine 需要等待子 goroutine 完成time.Sleep(1 * time.Second)
}func sayHello(name string) {fmt.Printf("Hello, %s\n", name)
}

输出

Hello, Alice
Hello, Bob

2. 多个 Goroutine

package mainimport ("fmt""time"
)func main() {for i := 1; i <= 5; i++ {go func(id int) {fmt.Printf("Goroutine %d 开始\n", id)time.Sleep(time.Duration(id) * time.Second)fmt.Printf("Goroutine %d 完成\n", id)}(i)}// 等待所有 goroutine 完成time.Sleep(6 * time.Second)fmt.Println("主程序结束")
}

输出

Goroutine 1 开始
Goroutine 2 开始
Goroutine 3 开始
Goroutine 4 开始
Goroutine 5 开始
Goroutine 1 完成
Goroutine 2 完成
Goroutine 3 完成
Goroutine 4 完成
Goroutine 5 完成
主程序结束

go func()go sayHello("Bob") 的区别

特性go func()go sayHello("Bob")
类型匿名函数命名函数
定义位置调用处定义提前定义
代码量适合简短逻辑适合复杂逻辑
可重用性不可重用可重用
闭包可访问外部变量需要参数传递

Goroutine vs 线程

特性Goroutine线程
内存占用~2KB~1-2MB
创建速度极快较慢
数量可创建百万级通常数百个
切换成本
管理Go 运行时操作系统

与 Channel 结合

package mainimport ("fmt"
)func main() {// 创建 channelresults := make(chan string)// 启动 goroutinego func() {results <- "任务 1 完成"}()go func() {results <- "任务 2 完成"}()// 接收结果fmt.Println(<-results)fmt.Println(<-results)
}

输出

任务 1 完成
任务 2 完成

常见模式

1. 使用 sync.WaitGroup 等待完成

package mainimport ("fmt""sync"
)func main() {var wg sync.WaitGroupfor i := 1; i <= 3; i++ {wg.Add(1)go func(id int) {defer wg.Done()fmt.Printf("Goroutine %d 执行\n", id)}(i)}wg.Wait()fmt.Println("所有 goroutine 完成")
}

2. 并发 HTTP 请求

package mainimport ("fmt""net/http""sync"
)func main() {urls := []string{"https://example.com","https://google.com","https://github.com",}var wg sync.WaitGroupfor _, url := range urls {wg.Add(1)go func(u string) {defer wg.Done()resp, err := http.Get(u)if err != nil {fmt.Printf("请求 %s 失败: %v\n", u, err)} else {fmt.Printf("请求 %s 成功,状态码: %d\n", u, resp.StatusCode)}}(url)}wg.Wait()
}

注意事项

⚠️ 常见问题

  • 主 goroutine 过早退出:子 goroutine 还未完成就结束了
  • 竞态条件:多个 goroutine 同时修改共享变量
  • 死锁:goroutine 互相等待

最佳实践

  • 使用 sync.WaitGroupchannel 等待 goroutine 完成
  • 使用 sync.Mutex 保护共享数据
  • 避免在 goroutine 中直接修改外部变量(使用参数传递)
http://www.dtcms.com/a/540167.html

相关文章:

  • 船舶终端数据采集与监管平台一体化方案
  • 2025年10月28日Github流行趋势
  • 《红色脉络:一部PLMN在中国的演进史诗 (1G-6G)》 第14篇 | 6G畅想:通感一体、AI内生——下一代网络的愿景与挑战
  • 「Java EE开发指南」如何用MyEclipse设置Java项目依赖项属性?
  • 输电线路防外破在线监测装置是什么
  • MTK5G旗舰系列——天玑9500/9400/9300/9200/9000在AI和处理器性能、DDR频率及UFS的深度对比分析
  • 平板做网站服务器wordpress在线直播插件
  • 前端Jquery,后端Java实现预览Word、Excel、PPT,pdf等文档
  • 华为910B服务器(搭载昇腾Ascend 910B AI 芯片的AI服务器查看服务器终端信息
  • Spring JDBC实战:参数处理与嵌入式数据库
  • 图片转PPT:用Java高效处理PowerPoint的秘籍
  • Custom Animations for PPT (PowerPoint)
  • 沈阳网站哪家做的好做视频网站设备需求
  • 【数据工程】16. Notions of Time in Stream Processing
  • AOI在传统汽车制造领域中的应用
  • 搭建网站复杂吗微信公众号怎么做链接网站
  • 网站优化推广招聘wordpress后台打开超慢
  • Linux软件编程笔记三——标准IO(二进制)文件IO
  • 如何使用 TinyEditor 快速部署一个协同编辑器
  • pgsql常用函数
  • 企业落地 NL2SQL,需要的是 AI-ready data 和小模型
  • 最好的购物网站排名厦门的推广公司有哪些
  • PyTorch2 Python深度学习 - 初识PyTorch2,实现一个简单的线性神经网络
  • 外贸网站建设gif制作软件app
  • 我回来了,依然关注新能源汽车研发测试,
  • Go 语言数组
  • Go语言-->sync.WaitGroup 详细解释
  • 从“造机器”到“造生态”:中国智能时代的系统跃迁——从宇树实训平台到视频神经系统的启示
  • YOLOV5_TensorRT_C++部署
  • 海南省住房和城乡建设官方网站网站域名不备案