在 Debian 上学习 Go 并发,最容易卡住的通常不是语法,而是“什么时候该开 goroutine、什么时候该用 channel,以及程序跑起来后该怎么看结果”。这篇文章按“先装环境、再跑示例、最后排查问题”的顺序展开,保留原始命令和代码,用尽量直观的方式说明并发执行、结果传递和调试定位各自对应的使用场景。
先把 Debian 上的 Go 环境装好
在开始并发示例之前,先确认系统里已经有可用的 Go 工具链。Debian 下直接用 apt 安装即可。
更新包列表:
sudo apt update安装 Go:
sudo apt install golang-go检查版本:
go version
只要 go version 能正常输出版本号,就说明环境已经具备运行示例的条件。
goroutine:Go 并发的起点
Go 的并发入口是 goroutine。它可以理解为由 Go 运行时调度的轻量级执行单元,启动方式也很直接:在函数调用前加一个 go 关键字即可。

示例:两个执行流如何并发输出
package main
import (
"fmt"
"time"
)
func printNumbers() {
for i := 1; i <= 5; i++ {
fmt.Printf("Number: %dn", i)
time.Sleep(1 * time.Second)
}
}
func main() {
go printNumbers() // 启动一个新的goroutine
// 主goroutine继续执行
for i := 1; i <= 5; i++ {
fmt.Printf("Main: %dn", i)
time.Sleep(1 * time.Second)
}
}
这段代码里,printNumbers() 被放进新的 goroutine 执行,而 main() 里的循环不会等待它结束。结果就是两个输出流会并发推进,并且大概率交错打印。
这里有两个判断点值得注意:
输出顺序不是固定的,因为 goroutine 的调度由 Go 运行时控制。
示例里之所以能看到交替输出,是因为主 goroutine 也通过
time.Sleep(1 * time.Second)保持了一段运行时间。
channel:让 goroutine 之间安全通信
只有“同时运行”还不够,实际程序往往还需要在多个 goroutine 之间传递结果、协调执行次序。这时候就该用 channel。

示例:拆分任务并汇总结果
下面这个例子把一个切片分成两半,分别交给两个 goroutine 求和,再通过 channel 把结果传回主流程。
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 将结果发送到channel
close(c)
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 从channel接收结果
fmt.Println(x, y, x+y)
}
从结构上看,这段代码体现了 channel 的两个核心作用:
传递数据:两个 goroutine 把各自的求和结果写入
c。同步执行:主 goroutine 在
<-c这里接收结果,没有数据到达前会等待。
因此,x 和 y 哪个先收到并不固定,取决于哪一半先算完;但只要数据都成功写入,最终的总和就是一致的。
阅读这个示例时要特别留意什么
这个示例能帮助理解 channel 的工作方式,但也要注意它展示的是“结果传递”的思路。实际编写并发代码时,channel 的关闭时机、发送方数量和接收方数量都需要严格对应,否则很容易引出阻塞或其他并发问题。
如何在 Debian 上运行这个并发程序
把示例保存成文件后,直接用 go run 即可执行。
将代码保存为文件,例如
concurrency.go。运行命令:
go run concurrency.go
执行后,Go 会自动完成编译并启动程序。对于 goroutine 示例,你通常会看到多路输出交错出现;对于 channel 示例,则会看到两个分段求和结果以及最终总和。
并发程序怎么调试和排查问题
并发代码最常见的问题并不是“写不出来”,而是“跑起来结果偶现异常、性能不稳定,或者根本不知道卡在哪”。Go 已经准备了两类很实用的工具。

用 pprof 看 goroutine 状态
如果你想分析 goroutine 的运行状态、定位性能瓶颈,可以使用 pprof:
go tool pprof http://localhost:6060/debug/pprof/goroutine
这个入口适合用来观察 goroutine 的数量、状态分布,以及程序是否存在明显的阻塞热点。
用 race detector 查数据竞争
数据竞争是并发程序里最典型、也最隐蔽的一类问题。Go 自带的 race detector 可以直接用于测试阶段排查:
go test -race ./...
如果你的并发程序涉及共享变量、多个 goroutine 同时读写同一份数据,这条命令通常值得优先执行一遍。
Debian 上学 Go 并发,先掌握这条主线
把这篇文章的内容串起来,主线其实很清晰:先在 Debian 上装好 Go,再用 goroutine 理解“并发执行”,接着用 channel 解决“结果传递和同步”,最后借助 pprof 和 -race 处理性能与正确性问题。
对于刚开始接触 Go 并发的开发者来说,这套路径足够完成从环境准备到基础实战的第一轮上手。后续继续深入时,重点就会从“能跑”转向“能稳定跑、能定位问题、能控制并发行为”。







