我对 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
}
启动一个 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)
}