为什么后端爱用 Go:goroutine 与 channel 并发入门

举报
茉莉风铃 发表于 2026/09/02 10:47:43 2026/09/02
【摘要】 Go 在后端圈火起来,很大程度靠"并发写起来便宜"。聊聊 goroutine 怎么做到轻量、channel 怎么代替锁来做通信,以及一个用 WaitGroup 等所有任务结束的最小可跑例子。

一、goroutine:一个 go 就开了个"轻线程"

传统线程开几千个就够呛,Go 的 goroutine 由运行时调度,开销极小,开几十万都不稀奇。用法也简单,加个 go 就行:

go func() {
    fmt.Println("我在另一个 goroutine 里跑")
}()

这对后端太友好了——每个请求起一个 goroutine 处理,模型清晰,不用自己管线程池。

二、channel:别用锁,用"传数据"通信

多个 goroutine 要共享结果,新手会想加锁。Go 的哲学是"不要通过共享内存来通信,而要通过通信来共享内存"——也就是用 channel 来传递数据:

ch := make(chan string, 3)
go func() { ch <- "任务A完成" }()
go func() { ch <- "任务B完成" }()
fmt.Println(<-ch, <-ch) // 从通道取结果

通道本身就保证了同步安全,比手写锁省心,也不容易写出死锁。

三、等所有任务结束:WaitGroup

实际场景常是"派一堆活,全部干完再汇总"。用 sync.WaitGroup

var wg sync.WaitGroup
for i := 1; i <= 5; i++ {
    wg.Add(1)
    go func(id int) {
        defer wg.Done()
        doWork(id) // 并发干 5 件活
    }(i)
}
wg.Wait() // 阻塞,等 5 件全完成
fmt.Println("全部搞定")

四、适合什么、不适合什么

场景 评价
高并发网络服务 Go 的主场,goroutine 模型天然契合
CPU 密集计算 不如专门的语言/库,goroutine 不加速计算
简单脚本 有点杀鸡用牛刀

小结

Go 的并发之所以好上手,是因为它把"开协程"和"传消息"都做成了语言级的一等公民:go 关键字和 channel 几乎零门槛。后端服务天生要扛大量并发连接,这套模型正好对上。入门记住三点就够了——go 开协程、channel 传数据、WaitGroup 等收尾。剩下的是在具体业务里慢慢体会"什么时候该用 channel、什么时候其实单线程更清楚"。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。