
time.Sleep()接收的是纳秒为单位的time.Duration,直接传入整数2会导致休眠仅2纳秒,无法等待goroutine执行完成;应使用2 * time.Second,但更推荐通过channel或sync包实现可靠同步。
`time.sleep()`接收的是纳秒为单位的`time.duration`,直接传入整数2会导致休眠仅2纳秒,无法等待goroutine执行完成;应使用`2 * time.second`,但更推荐通过channel或sync包实现可靠同步。
在Go程序中,time.Sleep()常被误用于“等待goroutine结束”,但其行为极易出错——根本原因在于参数类型理解偏差。time.Sleep()的签名是 func Sleep(d Duration),而Duration本质是int64,单位为纳秒。因此,time.Sleep(2) 实际仅暂停 2纳秒(远小于一次函数调用开销),主线程随即退出,导致所有尚未调度或正在运行的goroutine被强制终止,输出自然消失。
✅ 正确写法(按秒休眠):
package main
import (
"fmt"
"time"
)
func f(msg string) {
fmt.Println(msg)
}
func main() {
f("direct")
go f("goroutine")
go func(msg string) {
fmt.Println(msg)
}("going")
time.Sleep(2 * time.Second) // ✅ 显式指定单位:2秒
}
⚠️ 但请注意:依赖固定时长休眠进行同步是反模式。它既不可靠(goroutine执行时间受调度、负载影响),也不可扩展(如goroutine内含I/O或复杂计算,2秒可能过短或过长),更难以测试和维护。
? 推荐替代方案:
-
使用channel等待完成(最符合Go惯用法):
done := make(chan bool) go func() { f("goroutine") done -
使用sync.WaitGroup(适合批量goroutine):
var wg sync.WaitGroup wg.Add(2) go func() { defer wg.Done(); f("goroutine") }() go func() { defer wg.Done(); f("going") }() wg.Wait() // 阻塞直至全部完成
? 总结:time.Sleep(n) ≠ “等待n秒”,而是“等待n纳秒”;务必使用time.Second、time.Millisecond等常量组合;生产代码中,应优先选用channel或sync.WaitGroup实现精确、可预测的并发同步。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











