1 回答
TA贡献1797条经验 获得超6个赞
在 select 语句之前,两个通道都准备好了;因此它将通过统一的伪随机选择进行选择:
让我们替换doSomething代码中的函数调用,并将 defer 放在函数的末尾:
package main
import (
"errors"
"fmt"
"sync"
)
func main() {
errs := make(chan error, 1)
success := make(chan bool, 1)
var wg sync.WaitGroup
wg.Add(1)
go func() {
err := errors.New("some error")
errs <- err
wg.Done()
}()
wg.Wait()
success <- true
select {
case err := <-errs:
fmt.Println("error", err)
panic(err)
case <-success:
fmt.Println("success")
}
fmt.Println("finished successfully")
}
正如你在上面的代码示例中看到的,主 goroutine在这个时间点wg.Wait()等待,代码(几乎)在功能上等于以下代码,并且两个通道在此处的 select 语句之前准备好: wg.Done()
package main
import (
"errors"
"fmt"
)
func main() {
errs := make(chan error, 1)
success := make(chan bool, 1)
errs <- errors.New("some error")
success <- true
select {
case err := <-errs:
fmt.Println(err)
case <-success:
fmt.Println("success")
}
}
跑:
$ go run .
some error
$ go run .
success
选择语句:
如果一个或多个通信可以进行,则通过统一的伪随机选择选择一个可以进行的通信。否则,如果存在默认情况,则选择该情况。如果没有默认情况,“select”语句会阻塞,直到至少有一个通信可以继续。
- 1 回答
- 0 关注
- 81 浏览
添加回答
举报