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 關注
- 99 瀏覽
添加回答
舉報