为什么这段 Go 代码使用 goroutine 没有输出任何内容?

huangapple go评论85阅读模式
英文:

why doesn't this go code print anything with a goroutine

问题

我可能对goroutine的一些基本知识有所遗漏,但我已经查看了一些资料,没有找到任何原因说明这段代码不能正常工作...

package main

import "fmt"

func main() {
    for i := 0; i < 20; i++ {
        //fmt.Println(i)
        go func(j int) {
            fmt.Println(j + 100)
        }(i)
    }
}
英文:

I must be missing something really basic about goroutines, but I've looked around and I cannot see any reason why this would not work...

package main

import &quot;fmt&quot;

func main() {
	for i := 0; i &lt; 20; i++ {
		//fmt.Println(i)
		go func(j int) {
			fmt.Println(j + 100)
		}(i)
	}
}

答案1

得分: 6

你的程序在协程有机会运行之前就已经结束了。

以下是使用WaitGroup的代码示例:

package main

import (
	"fmt"
	"sync"
)

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 20; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			fmt.Println(j + 100)
		}(i)
	}
	fmt.Println("Waiting...")
	wg.Wait()
	fmt.Println("Done.")
}

你可以在这里找到完整的代码:https://play.golang.org/p/lmCPU9-qkB

WaitGroup 是一个用于等待一组协程完成的工具。在每个协程启动时,你需要调用wg.Add(1)来增加等待组的计数器。在协程完成时,你需要调用wg.Done()来减少计数器。最后,通过调用wg.Wait()来等待所有协程完成。

英文:

Your program is finishing before your goroutines have a chance to run.

Here's your code with a WaitGroup:

package main

import (
	&quot;fmt&quot;
	&quot;sync&quot;
)

func main() {
	var wg sync.WaitGroup
	for i := 0; i &lt; 20; i++ {
		wg.Add(1)
		go func(j int) {
			defer wg.Done()
			fmt.Println(j + 100)
		}(i)
	}
	fmt.Println(&quot;Waiting...&quot;)
	wg.Wait()
	fmt.Println(&quot;Done.&quot;)
}

https://play.golang.org/p/lmCPU9-qkB

答案2

得分: 1

根据Go的规范:

程序的执行从初始化主包开始,然后调用main函数。当该函数调用返回时,程序退出。它不会等待其他(非主)goroutine完成。

请参考Jack的答案获取一个可工作的版本。

英文:

From the spec of Go:

> Program execution begins by initializing the main package and then
> invoking the function main. When that function invocation returns, the
> program exits. It does not wait for other (non-main) goroutines to
> complete.

See Jack's answer for a working version.

huangapple
  • 本文由 发表于 2017年2月14日 12:41:31
  • 转载请务必保留本文链接:https://go.coder-hub.com/42217995.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定