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

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

慣用的 goroutine 并發(fā)和錯(cuò)誤處理

慣用的 goroutine 并發(fā)和錯(cuò)誤處理

Go
慕工程0101907 2022-12-19 21:38:26
在下面的代碼塊中,我試圖運(yùn)行幾個(gè)例程并為所有例程獲取結(jié)果(無(wú)論是成功還是錯(cuò)誤)。package main        import (        "fmt"        "sync"    )        func processBatch(num int, errChan chan<- error, resultChan chan<- int, wg *sync.WaitGroup) {        defer wg.Done()            if num == 3 {            resultChan <- 0            errChan <- fmt.Errorf("goroutine %d's error returned", num)        } else {            square := num * num                resultChan <- square                errChan <- nil        }        }        func main() {        var wg sync.WaitGroup            batches := [5]int{1, 2, 3, 4, 5}            resultChan := make(chan int)        errChan := make(chan error)            for i := range batches {            wg.Add(1)            go processBatch(batches[i], errChan, resultChan, &wg)        }            var results [5]int        var err [5]error        for i := range batches {            results[i] = <-resultChan            err[i] = <-errChan        }        wg.Wait()        close(resultChan)        close(errChan)        fmt.Println(results)        fmt.Println(err)    }游樂(lè)場(chǎng):https ://go.dev/play/p/zA-Py9gDjce 此代碼有效,我得到了我想要的結(jié)果,即:[25 1 4 0 16][<nil> <nil> <nil> goroutine 3's error returned <nil>]我想知道是否有更慣用的方法來(lái)實(shí)現(xiàn)這一目標(biāo)。我瀏覽了 errgroup 包:https ://pkg.go.dev/golang.org/x/sync/errgroup但沒(méi)能在這里找到對(duì)我有幫助的東西。歡迎提出任何建議。
查看完整描述

1 回答

?
SMILET

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

Waitgroup 在此代碼中是多余的。執(zhí)行與等待通道結(jié)果的循環(huán)完美同步。在所有功能完成工作并從通道讀取發(fā)布的結(jié)果之前,代碼不會(huì)向前移動(dòng)。僅當(dāng)您的函數(shù)需要在結(jié)果發(fā)布到通道后執(zhí)行任何工作時(shí)才需要 Waitgroup。


我也更喜歡稍微不同的實(shí)現(xiàn)。在發(fā)布的實(shí)現(xiàn)中,我們不會(huì)在每次執(zhí)行函數(shù)時(shí)將結(jié)果和錯(cuò)誤都發(fā)送到通道中。相反,我們可以只發(fā)送成功執(zhí)行的結(jié)果,并在代碼失敗時(shí)只發(fā)送錯(cuò)誤。


優(yōu)點(diǎn)是簡(jiǎn)化了結(jié)果/錯(cuò)誤處理。我們?cè)跊](méi)有nils.


在這個(gè)例子中,函數(shù)返回一個(gè)數(shù)字,我們發(fā)送它的默認(rèn)值0以防出錯(cuò)。如果零可能是合法的函數(shù)執(zhí)行結(jié)果,則從成功中過(guò)濾出不成功的執(zhí)行結(jié)果可能會(huì)很復(fù)雜。


與錯(cuò)誤相同。要檢查我們是否有任何錯(cuò)誤,我們可以使用像if len(errs) != 0.


package main


import (

    "fmt"

)


func processBatch(num int, errChan chan<- error, resultChan chan<- int) {

    if num == 3 {

        // no need to send result when it is meanenless

        // resultChan <- 0

        errChan <- fmt.Errorf("goroutine %d's error returned", num)

    } else {

        square := num * num


        resultChan <- square


        // no need to send errror when it is nil

        // errChan <- nil

    }


}


func main() {

    batches := [5]int{1, 2, 3, 4, 5}


    resultChan := make(chan int)

    errChan := make(chan error)


    for i := range batches {

        go processBatch(batches[i], errChan, resultChan)

    }


    // use slices instead of arrays because legth varry now

    var results []int

    var errs []error


    // every time function executes it sends singe piece of data to one of two channels

    for range batches {

        select {

        case res := <-resultChan:

            results = append(results, res)

        case err := <-errChan:

            errs = append(errs, err)

        }

    }


    close(resultChan)

    close(errChan)


    fmt.Println(results)

    fmt.Println(errs)

}

https://go.dev/play/p/SYmfl8iGxgD


[25 1 16 4]

[goroutine 3's error returned]

如果你可以使用外部包,我們可以從一些multierr包中獲益。例如,github.com/hashicorp/go-multierror。


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

添加回答

舉報(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)