You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段Golang代码无法输出20条问候语?

问题分析

你的代码里,两个SayGreetings goroutine还没跑完10次循环,主goroutine就因为time.Sleep(2 * time.Second)到期而退出了——Go程序只要主goroutine结束,所有其他goroutine都会被强制终止,不管它们有没有执行完任务。

看SayGreetings里的休眠逻辑:每次最多休眠2.5秒,就算每次都睡0秒,10次循环也要输出10条,但主goroutine只等2秒,大概率两个goroutine都没跑完10次,自然出不来20条问候语。

解决方案

用sync.WaitGroup来等待所有子goroutine执行完毕,这是Go里等待并发任务完成的标准做法:

package main

import (
    "log"
    "math/rand"
    "sync"
    "time"
)

func SayGreetings(greeting string, times int, wg *sync.WaitGroup) {
    // 任务完成后调用Done,通知WaitGroup计数器减一
    defer wg.Done()
    for i := 0; i < times; i++ {
        log.Println(greeting)
        d := time.Second * time.Duration(rand.Intn(5)) / 2
        time.Sleep(d)
    }
}

func main() {
    rand.Seed(time.Now().UnixNano())
    log.SetFlags(0)
    
    var wg sync.WaitGroup
    // 要等待2个goroutine,所以计数器设为2
    wg.Add(2)
    
    go SayGreetings("hi!", 10, &wg)
    go SayGreetings("hello!", 10, &wg)
    
    // 阻塞主goroutine,直到所有子goroutine都调用Done,计数器归0
    wg.Wait()
}

如果你只是临时测试,也可以把主goroutine的休眠时间延长到足够长(比如15秒),但这种方法不严谨——你没法准确预估所有任务的执行时间,用WaitGroup才是可靠的方案。

内容的提问来源于stack exchange,提问作者user18625843

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 10:10:30