在使用 Golang 进行实验时,我创建了一个带有 select 语句的函数,它监听两个通道。
我的问题是代码似乎表现得不确定——有时它会恐慌,有时它会成功完成。
我的期望是这段代码应该总是恐慌。它应该首先收到错误,因为它应该在 waitGroup 完成之前调度,因此在成功通道被推送到之前。
package main
import (
"errors"
"fmt"
"sync"
)
func main() {
errs := make(chan error, 1)
success := make(chan bool, 1)
doSomething(success, errs)
select {
case err := <-errs:
fmt.Println("error", err)
panic(err)
case <-success:
fmt.Println("success")
}
fmt.Println("finished successfully")
}
func doSomething(success chan bool, errs chan error) {
var wg sync.WaitGroup
wg.Add(1)
go func() {
defer wg.Done()
err := errors.New("Some error")
errs <- err
}()
wg.Wait()
success <- true
}
互换的青春
相关分类