英文:
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 "fmt"
func main() {
for i := 0; i < 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 (
"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.")
}
答案2
得分: 1
根据Go的规范:
程序的执行从初始化主包开始,然后调用main函数。当该函数调用返回时,程序退出。它不会等待其他(非主)goroutine完成。
请参考Jack的答案获取一个可工作的版本。
英文:
> 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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论