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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

并行獲取多個字段的模式

并行獲取多個字段的模式

Go
jeck貓 2023-07-17 14:48:55
我需要從外部服務(wù)為我的系統(tǒng)并行獲取多個字段(在本例中,通過 Name()、Age() 和 CanDrive() 方法模擬)。fetchUser() 方法可以實現(xiàn)我想要的功能,但它似乎太冗長了,特別是如果您認為我可以有 10 個以上的字段。我有更好的方法可以實現(xiàn)這一點嗎?游樂場:https://play.golang.org/p/90sNq1GmrD8代碼(與游樂場中相同):package mainimport (    "fmt"    "sync")type User struct {    Name string    Age int    CanDrive *bool}func Name() (string, error) {    return "foobar", nil}func Age() (int, error) {    return 25, nil}func CanDrive() (bool, error) {    return true, nil}func fetchUser() (*User, error) {    var wg sync.WaitGroup    errs := make(chan error)    user := &User{}    wg.Add(1)    go func() {        var err error        defer wg.Done()        user.Name, err = Name()        errs <- err    }()    wg.Add(1)    go func() {        var err error        defer wg.Done()        user.Age, err = Age()        errs <- err    }()    wg.Add(1)    go func() {        defer wg.Done()        canDrive, err := CanDrive()        if err == nil {            user.CanDrive = &canDrive        }        errs <- err    }()    // wait until all go-routines are completed successfully    // if that's the case, close the errs channel    go func() {        wg.Wait()        close(errs)    }()    // keep waiting for errors (or for the error channel to be closed    // if all calls succeed)    for err := range errs {        if err != nil {            return nil, err        }    }    return user, nil}func main() {    user, _ := fetchUser()    fmt.Println(user)}
查看完整描述

1 回答

?
牛魔王的故事

TA貢獻1830條經(jīng)驗 獲得超3個贊

在不了解您的場景的更多細節(jié)的情況下,我唯一的建議是將 Go 例程錯誤處理分離到另一個包中。

幸運的是,已經(jīng)存在一個可以執(zhí)行相同操作的包,名為errgroup.?以下是使用該包的原始代碼的實現(xiàn)errgroup

package main


import (

? ? "context"

? ? "fmt"


? ? "golang.org/x/sync/errgroup"

)


type User struct {

? ? Name? ? ?string

? ? Age? ? ? int

? ? CanDrive *bool

}


func Name() (string, error) {

? ? return "foobar", nil

}


func Age() (int, error) {

? ? return 25, nil

}


func CanDrive() (bool, error) {

? ? return true, nil

}


func fetchUser(ctx context.Context) (*User, error) {

? ? group, ctx := errgroup.WithContext(ctx)


? ? user := &User{}

? ? group.Go(func() (err error) {

? ? ? ? user.Name, err = Name()

? ? ? ? return

? ? })

? ? group.Go(func() (err error) {

? ? ? ? user.Age, err = Age()

? ? ? ? return

? ? })

? ? group.Go(func() error {

? ? ? ? canDrive, err := CanDrive()

? ? ? ? if err == nil {

? ? ? ? ? ? user.CanDrive = &canDrive

? ? ? ? }

? ? ? ? return err

? ? })


? ? if err := group.Wait(); err != nil {

? ? ? ? return nil, err

? ? }


? ? return user, nil

}


func main() {

? ? user, err := fetchUser(context.Background())

? ? fmt.Println(user, err)

}


查看完整回答
反對 回復 2023-07-17
  • 1 回答
  • 0 關(guān)注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

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