第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

從多個(gè)渠道讀取錯(cuò)誤

從多個(gè)渠道讀取錯(cuò)誤

Go
海綿寶寶撒 2022-12-19 11:49:51
像許多 go 程序員一樣,到目前為止都避免對(duì)通道做任何重要的事情,所以這個(gè)看似簡(jiǎn)單的場(chǎng)景讓我感到難過(guò)!我希望多個(gè) goroutines 發(fā)送由單親檢查的結(jié)果。如果有任何發(fā)送錯(cuò)誤,父母應(yīng)該發(fā)出信號(hào)讓他們?nèi)客V?。父母?yīng)該不按順序閱讀結(jié)果。如果其中一個(gè) goroutine 確實(shí)發(fā)送錯(cuò)誤,則此代碼有效,即如果您在11內(nèi)部 nums 中發(fā)表評(píng)論,否則我們將永遠(yuǎn)陷入 for 循環(huán)。func main() {    type Result struct {        Error    error        Response int    }    checkStatus := func(done <-chan interface{}, ns []int) <-chan Result {        results := make(chan Result)        go func() {            defer close(results)            for _, n := range ns {                result := Result{Response: n}                if n == 11 {                    result.Error = fmt.Errorf("problem...\n")                }                select {                case <-done:                    return                case results <- result:                }            }        }()        return results    }    done := make(chan interface{})    defer close(done)    nums := []int{1, 2, 3, 4, 5 /*11,*/, 6, 7, 8, 9, 10}    c1 := checkStatus(done, nums[:5])    c2 := checkStatus(done, nums[5:])    for {        var r Result        select {        case r = <-c1:            if r.Error != nil {                fmt.Printf("error1: %v", r.Error)                return            }            fmt.Printf("Response1: %v\n", r.Response)        case r = <-c2:            if r.Error != nil {                fmt.Printf("error2: %v", r.Error)                return            }            fmt.Printf("Response2: %v\n", r.Response)        }    }}我能看到修復(fù)它的唯一方法是更改for循環(huán),以便它從中讀取c1,c2但我看不到非順序執(zhí)行此操作的方法?https://go.dev/play/p/7dRPMDn1Za2
查看完整描述

1 回答

?
函數(shù)式編程

TA貢獻(xiàn)1807條經(jīng)驗(yàn) 獲得超9個(gè)贊

您正在從封閉的渠道中閱讀,他們總是返回零值。您可以做的是在從通道讀取時(shí)使用逗號(hào) ok 習(xí)慣用法關(guān)閉選擇案例,然后將通道分配給 nil。如果另一個(gè)也為零,則返回。


case使用 nil 通道永遠(yuǎn)不會(huì)運(yùn)行。


只需擴(kuò)展您的代碼(與 的情況類似c2):


case r, ok := <-c1:

    if !ok {

        c1 = nil

        if c2 == nil {

            return

        }

        continue

    }

    if r.Error != nil {

        fmt.Printf("error1: %v", r.Error)

        return

    }

    fmt.Printf("Response1: %v\n", r.Response)

但我寧愿嘗試重構(gòu)整個(gè)實(shí)現(xiàn)。


您可以考慮使用sync.WaitGroup來(lái)自syncpkg 或errgroup.Group來(lái)自errgrouppkg.


查看完整回答
反對(duì) 回復(fù) 2022-12-19
  • 1 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)