假設我有以下代碼(操場):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 關注
- 120 瀏覽
添加回答
舉報
0/150
提交
取消