閫氳繃golang杩涜Select Channels Go骞跺彂寮忕紪绋嬬殑閿欒澶勭悊鏂规硶
鍦℅o骞跺彂寮忕紪绋嬩腑锛屽彲浠ヤ娇鐢╯elect璇彞鏉ュ悓鏃剁洃鍚涓€氶亾鐨勬暟鎹祦鍔紝骞舵牴鎹笉鍚岀殑鎯呭喌杩涜澶勭悊銆傚綋涓€涓垨澶氫釜閫氶亾鏈夋暟鎹彲璇绘椂锛宻elect璇彞浼氶殢鏈洪€夋嫨涓€涓猚ase鏉ユ墽琛屻€?/p>
鍦ㄥ鐞嗛敊璇椂锛屽彲浠ュ皢閿欒淇℃伅鍙戦€佸埌涓€涓笓闂ㄧ殑閿欒閫氶亾锛屽苟鍦╯elect璇彞涓坊鍔犱竴涓猚ase鏉ュ鐞嗛敊璇€?/p>
涓嬮潰鏄竴涓ず渚嬩唬鐮侊細
package main
import (
"fmt"
"time"
)
func doWork(input chan string, errCh chan error) {
// 妯℃嫙涓€涓伐浣滀换鍔?/span>
time.Sleep(2 * time.Second)
// 鍋囪鍦ㄨ繖閲屽彂鐢熶簡涓€涓敊璇?/span>
err := fmt.Errorf("something went wrong")
errCh <- err
}
func main() {
input := make(chan string)
errCh := make(chan error)
go doWork(input, errCh)
select {
case <-input:
// 澶勭悊杈撳叆鏁版嵁
fmt.Println("Received input data")
case err := <-errCh:
// 澶勭悊閿欒
fmt.Println("Received error:", err)
}
}
鍦ㄨ繖涓緥瀛愪腑锛?code>doWork鍑芥暟妯℃嫙浜嗕竴涓伐浣滀换鍔★紝鍦ㄤ换鍔″畬鎴愬悗鍚?code>input閫氶亾鍙戦€佷簡涓€涓暟鎹€傜劧鍚庯紝鍦?code>doWork鍑芥暟涓彂鐢熶簡涓€涓敊璇紝骞跺皢閿欒淇℃伅閫氳繃errCh
閫氶亾浼犻€掑嚭鏉ャ€?/p>
鍦?code>main鍑芥暟涓紝閫氳繃select
璇彞鐩戝惉input
鍜?code>errCh閫氶亾銆傚鏋?code>input閫氶亾鏈夋暟鎹彲璇伙紝鍒欏鐞嗚緭鍏ユ暟鎹紝鍚﹀垯濡傛灉errCh
閫氶亾鏈夐敊璇俊鎭彲璇伙紝鍒欏鐞嗛敊璇€?/p>
闇€瑕佹敞鎰忕殑鏄紝鍦?code>doWork鍑芥暟涓紝濡傛灉娌℃湁鍙戠敓閿欒锛屽彲浠ラ€夋嫨灏?code>nil鍊煎彂閫佸埌errCh
閫氶亾锛岃〃绀烘病鏈夐敊璇彂鐢熴€?/p>
杩欑鏂规硶鍙互鍦℅o骞跺彂寮忕紪绋嬩腑杩涜閿欒澶勭悊锛岄伩鍏嶄簡闃诲鍜屾閿佺殑闂锛屽苟涓旇兘澶熷悓鏃跺鐞嗕笉鍚岄€氶亾鐨勬暟鎹拰閿欒銆?/p>
相关问答