我有以下代码。特别注意匿名功能:
func saveMatterNodes(matterId int, nodes []doculaw.LitigationNode) (bool, error) {
var (
err error
resp *http.Response
)
// Do this in multiple threads
for _, node := range nodes {
fmt.Println("in loops")
go func() {
postValues := doculaw.LitigationNode{
Name: node.Name,
Description: node.Description,
Days: node.Days,
Date: node.Date,
IsFinalStep: false,
Completed: false,
Matter: matterId}
b := new(bytes.Buffer)
json.NewEncoder(b).Encode(postValues)
resp, err = http.Post("http://127.0.0.1:8001/matterNode/", "application/json", b)
io.Copy(os.Stdout, resp.Body)
fmt.Println("Respone from http post", resp)
if err != nil {
fmt.Println(err)
}
}()
}
if err != nil {
return false, err
} else {
return true, nil
}
}
如果我删除了go func() {}()
部分并且只是将代码保留在它之间,它似乎执行正常但是当我添加它的那一刻它就不会执行。知道为什么会这样吗?我最初想的可能是因为它在不同的线程上执行但是这似乎并非如此,因为我可以在我的webservice访问日志中看到它没有执行。
答案 0 :(得分:4)
我认为这种行为是因为函数永远不会返回主线程(启动goroutines后,程序中没有构造等待它们完成工作)。 使用通道,IO操作,sync.WaitGroup等可以将控制权交还给主线程。
您可能想尝试sync.WaitGroup