This question already has answers here:
No output from goroutine
(3个答案)
2年前关闭。
我正在尝试入门,并且遇到在结构方法上使用go例程时出现的问题。我期待的是该代码显示以下输出:
询问项目1是否还活着
询问项目2是否还活着
但这没有打印任何内容。当我省去“去”例程(在struct1.isAlive()处)时,它工作正常。我如何使goroutines工作?
(3个答案)
2年前关闭。
我正在尝试入门,并且遇到在结构方法上使用go例程时出现的问题。我期待的是该代码显示以下输出:
询问项目1是否还活着
询问项目2是否还活着
但这没有打印任何内容。当我省去“去”例程(在struct1.isAlive()处)时,它工作正常。我如何使goroutines工作?
package main
import (
"fmt"
)
type somestruct struct {
ID int
ItemName string
}
func (s *somestruct) isAlive() (alive bool) {
alive = true
fmt.Printf("%s was asked if it's alive \n", s.ItemName)
return
}
func main() {
struct1 := somestruct{
ID:1,
ItemName:"Item 1"}
struct2 := somestruct{
ID:2,
ItemName:"Item 2"}
go struct1.isAlive()
go struct2.isAlive()
最佳答案
问题是程序在函数执行之前退出并打印到stdout。
一种简单的解决方法是等待两个go例程均完成,然后退出主函数。
这是您可以参考的链接:https://nathanleclaire.com/blog/2014/02/15/how-to-wait-for-all-goroutines-to-finish-executing-before-continuing/
这是用WaitGroups实现的程序
package main
import (
"fmt"
"sync"
)
type somestruct struct {
ID int
ItemName string
wg *sync.WaitGroup
}
func (s *somestruct) isAlive() (alive bool) {
defer s.wg.Done()
alive = true
fmt.Printf("%s was asked if it's alive \n", s.ItemName)
return
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
struct1 := somestruct{
ID: 1,
ItemName: "Item 1",
wg: &wg,
}
struct2 := somestruct{
ID: 2,
ItemName: "Item 2",
wg: &wg,
}
go struct1.isAlive()
go struct2.isAlive()
wg.Wait()
}
10-01 02:44