Я все еще испытываю, как наилучшим образом использовать каналы.
У меня 5 исходящих вызовов на обслуживание (на ответ ~ 2 минуты), и каждый из них дает мне пару возвращаемых значений.
например func serviceCall()(T, error)
Я хочу сделать их параллельными, но я нахожу код очень длинным.
По сути, мне нужно создать 5 каналов, 5 структур для хранения возвращаемого значения.
Я написал простой пример для выражения сценария, я хочу знать, каков шаблон для этого сценария, как я могу сделать этот код лучше.
основной пакет
import (
"fmt"
"math/rand"
"time"
"log"
)
// goal: run multiple functions concurrently and process the results.
func main() {
now := time.Now()
// method1
type res1 struct {
news string
err error
}
type res2 struct {
n int
err error
}
ch1 := make(chan *res1)
ch2 := make(chan *res2)
go func() {
var res res1
res.news, res.err = news1()
ch1 <- &res
}()
go func() {
var res res2
res.n, res.err = news2()
ch2 <- &res
}()
one := <-ch1
if one.err != nil {
log.Fatal(one.err)
}
fmt.Println("news1: ", one.news)
two := <-ch2
if two.err != nil {
log.Fatal(two.err)
}
fmt.Println("news2: ", two.n)
fmt.Println("time elapsed: ", time.Since(now))
}
// first sleeps 5 seconds and returns random number or error.
func news1() (string, error) {
time.Sleep(time.Second * 5)
return "new1 is here.", nil
}
// second sleeps random seconds and returns random number or error.
func news2() (int, error) {
n := rand.Intn(20)
time.Sleep(time.Duration(n) * time.Second)
return n, nil
}