假设我有以下代码(操场):package mainimport ( "fmt" "sync")func createStr() *string { tmp := "foo" return &tmp}func main() { var ( s *string wg sync.WaitGroup ) go func() { wg.Add(1) defer wg.Done() s = createStr() }() wg.Wait() fmt.Printf("s after: %v", s)}我本来期望 s 不等于 nil。但是,如果我添加一个小等待,我会得到 s != nil ( playground ):package mainimport ( "fmt" "sync" "time")func createStr() *string { tmp := "foo" return &tmp}func main() { var ( s *string wg sync.WaitGroup ) go func() { wg.Add(1) defer wg.Done() s = createStr() }() wg.Wait() time.Sleep(time.Second) fmt.Printf("s after: %v", s)}这只是在我编写的程序中造成了一个错误。发生了什么并sync.WaitGroup没有导致我的程序等待 s 在我的 go func 中被分配一个字符串指针?
1 回答

墨色风雨
TA贡献1853条经验 获得超6个赞
您对Add方法的放置sync.WaitGroup是错误的。不要Add在 goroutine(这里是匿名 goroutine)中使用,而是在等待它的 goroutine(这里是 main goroutine)中使用它。
您的代码中发生的一种可能情况是wg.Wait()没有等待,因为 goroutinewg.Add(1)还没有被调用,因此s == nil. 下面的代码解决了这个问题:
去游乐场
package main
import (
"fmt"
"sync"
)
func createStr() *string {
tmp := "foo"
return &tmp
}
func main() {
var (
s *string
wg sync.WaitGroup
)
// Use wg.Add() here
wg.Add(1)
go func() {
defer wg.Done()
s = createStr()
}()
wg.Wait()
fmt.Printf("s after: %v", *s)
}
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报
0/150
提交
取消