以下代码表现不一致:执行时有概率只输出Main func,有概率输出Main func datais:user_new_an datais:user_an
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func testNewName() {
defer wg.Done()
time.Sleep(10)
test := "user_new_an"
res := fmt.Sprintf("datais:%s", test)
fmt.Println(res)
}
func testName() error {
test := "user_an"
wg.Add(1)
go testNewName()
wg.Wait()
res := fmt.Sprintf("datais:%s", test)
fmt.Println(res)
return nil
}
func main() {
go func() {
err := testName()
if err != nil {
fmt.Println("err")
}
}()
fmt.Println("Main func")
time.Sleep(1)
}
同理,以下代码也是概率性的:
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func testNewName() {
defer wg.Done()
time.Sleep(10)
test := "user_new_an"
res := fmt.Sprintf("datais:%s", test)
fmt.Println(res)
}
func testName() error {
test := "user_an"
wg.Add(1)
go testNewName()
wg.Wait()
res := fmt.Sprintf("datais:%s", test)
fmt.Println(res)
return nil
}
func main() {
go func() {
err := testName()
if err != nil {
fmt.Println("err")
}
}()
fmt.Println("Main func")
time.Sleep(1)
}
究竟为什么呢?我理解main方法结束后,嵌套的子协程会立即结束,但是从表现上看,子协程再嵌套的子协程有概率不会结束,有什么理论依据或者文档么?究竟怎么解释这种现象?