如何启动多个goroutines并分别获取每个goroutine的结果?

问题描述 投票:0回答:1

我对 Go 中使用通道的最佳方式有点困惑。我现在的处境是这样的:

我需要在3个goroutine中执行generateFruit、generateCity、generateCountry函数(每个goroutine在一个goroutine中),然后在main中对这3个结果执行一些操作(但我需要知道它对应的每件事的结果,即,我需要水果、城市和国家的结果,同样,我必须知道其中任何一个是否发生错误(我不想单独知道错误来自哪里)

package main

import (
    "errors"
    "math/rand"
    "time"
)

func generateFruit() (string, error) {
    time.Sleep(1 * time.Second)
    is_error := rand.Int() % 2
    if is_error == 0 {
        return "banana", nil
    } else {
        return "", errors.New("Some error")
    }
}

func generateCity() (string, error) {
    time.Sleep(1 * time.Second)
    is_error := rand.Int() % 2
    if is_error == 0 {
        return "toronto", nil
    } else {
        return "", errors.New("Some error")
    }
}

func generateCountry() (string, error) {
    time.Sleep(1 * time.Second)
    is_error := rand.Int() % 2
    if is_error == 0 {
        return "colombia", nil
    } else {
        return "", errors.New("Some error")
    }
}

func main() {
// Here
}
go concurrency goroutine
1个回答
0
投票

启动一个 goroutine,调用生成函数并将结果分配给变量。等待 goroutine 完成。 访问变量。

func main() {
    var fruit, city, country string
    var fruitErr, cityErr, countryErr error
    var wg sync.WaitGroup
    wg.Add(3)
    go func() {
        defer wg.Done()
        fruit, fruitErr = generateFruit()
    }()
    go func() {
        defer wg.Done()
        city, cityErr = generateCity()
    }()
    go func() {
        defer wg.Done()
        country, countryErr = generateCountry()
    }()
    wg.Wait()
    fmt.Println(fruit, fruitErr)
    fmt.Println(city, cityErr)
    fmt.Println(country, countryErr)
}
© www.soinside.com 2019 - 2024. All rights reserved.