Golang创建goroutine的正确方式
发布时间 - 2026-01-08 00:00:00 点击率:次Go中启动goroutine唯一合法方式是go后接函数调用表达式(如go f()),不可仅写函数值;其返回值被静默丢弃,main退出则所有goroutine强制终止,应使用sync.WaitGroup等待完成。
用 go 调用函数是最直接、也是唯一合法的方式
Go 语言中创建 goroutine 没有构造函数、没有 new 关键字、也没有 Goroutine 类型——它只是对一个函数调用加个 go 前缀。这既是它的简洁之处,也是新手误用的源头。
-
go后面必须是**函数调用表达式**(带括号),不能是函数值本身,比如go f是错的,go f()才对 - 被调用函数的返回值会被**静默丢弃**;若需结果,请改用
chan或显式传入指针/闭包变量 - goroutine 启动后立即返回,不阻塞当前执行流;main 函数退出 → 整个程序退出 → 所有 goroutine 被强制终止(哪怕还在跑)
避免 main 提前退出:用 sync.WaitGroup 等待完成
最常见的“goroutine 没打印”“任务没执行完就结束了”,几乎全是 main 函数跑太快导致的。别靠 time.Sleep 猜时长,那是调试伎俩,不是解决方案。
- 每个要等待的 goroutine 启动前,调用
wg.Add(1) - 在 goroutine 内部结尾处(或 defer 中)调用
wg.Done() - main 中用
wg.Wait()阻塞,直到所有计数归零
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done()
fmt.Printf("worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 3; i++ {
wg.Add(1)
go worker(i, &wg)
}
wg.Wait() // 这里会等全部完成才退出
}
传参陷阱:循环变量捕获要小心
在 for 循环里起多个 goroutine,又直接引用循环变量(如 i),极大概率所有 goroutine 都看到同一个最终值——这是闭包变量复用导致的经典 bug。
- 错误写法:
for i := 0; i → 输出可能是3 3 3 - 正确做法:把变量作为参数传进匿名函数
,或在循环体内定义新变量(如 ii := i)
for i := 0; i < 3; i++ {
go func(ii int) {
fmt.Println(ii) // 传值,各自独立
}(i)
}
需要取消或超时?必须用 context.Context
goroutine 不是永生的。长期运行的任务(如轮询、监听、计算)必须支持主动退出,否则可能造成资源泄漏或无法 graceful shutdown。
- 不要用全局 flag 或共享 bool 变量轮询判断——低效且难同步
- 用
context.WithCancel或context.WithTimeout创建可取消上下文 - 在 goroutine 内部用
select监听ctx.Done(),收到信号就 clean up 并 return
真正复杂的系统里,goroutine 的生命周期管理比创建本身重要得多;漏掉 context,上线后就只能靠 kill -9 收场。
# go
# golang
# ai
# for
# 构造函数
# select
# bool
# 循环
# 指针
# 闭包
# bug
# 返回值
# 这是
# 还在
# 那是
# 多个
# 之处
# 得多
# 才对
# 太快
# 要小心
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
如何快速搭建安全的FTP站点?
如何用AI帮你把自己的生活经历写成一个有趣的故事?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
如何在万网开始建站?分步指南解析
Android okhttputils现在进度显示实例代码
Laravel如何实现全文搜索功能?(Scout和Algolia示例)
网站制作免费,什么网站能看正片电影?
如何用狗爹虚拟主机快速搭建网站?
Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】
大连网站制作公司哪家好一点,大连买房网站哪个好?
网站页面设计需要考虑到这些问题
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
如何在阿里云域名上完成建站全流程?
Laravel怎么调用外部API_Laravel Http Client客户端使用
Python面向对象测试方法_mock解析【教程】
如何在建站主机中优化服务器配置?
JavaScript中的标签模板是什么_它如何扩展字符串功能
企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?
浅析上传头像示例及其注意事项
高防服务器:AI智能防御DDoS攻击与数据安全保障
5种Android数据存储方式汇总
Python并发异常传播_错误处理解析【教程】
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
制作旅游网站html,怎样注册旅游网站?
如何批量查询域名的建站时间记录?
图册素材网站设计制作软件,图册的导出方式有几种?
Laravel中的Facade(门面)到底是什么原理
如何挑选优质建站一级代理提升网站排名?
Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】
如何在腾讯云免费申请建站?
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
Laravel如何实现API版本控制_Laravel版本化API设计方案
Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Angular 表单中正确绑定输入值以确保提交与验证正常工作
在线制作视频网站免费,都有哪些好的动漫网站?
Python文本处理实践_日志清洗解析【指导】
如何快速搭建虚拟主机网站?新手必看指南
Laravel怎么使用artisan命令缓存配置和视图
IOS倒计时设置UIButton标题title的抖动问题
历史网站制作软件,华为如何找回被删除的网站?
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载
Laravel怎么实现支付功能_Laravel集成支付宝微信支付
lovemo网页版地址 lovemo官网手机登录
如何在宝塔面板中修改默认建站目录?


,或在循环体内定义新变量(如