私は比較的新しいので、同時にREST API
から情報を引き出す最良の方法を見つけようとしています。その目的は、API
への複数の同時呼び出しを行い、それぞれの呼び出しが異なるタイプのデータを返すことです。複数のタイプのゴルーチンとチャンネル
私は現在持っている:
s := NewClient()
c1 := make(chan map[string]Service)
c2 := make(chan map[string]ServicePlan)
c3 := make(chan map[string]ServiceInstance)
c4 := make(chan map[string]ServiceBinding)
c5 := make(chan map[string]Organization)
c6 := make(chan map[string]Space)
go func() {
c1 <- GetServices(s)
}()
go func() {
c2 <- GetServicePlans(s)
}()
go func() {
c3 <- GetServiceInstances(s)
}()
go func() {
c4 <- GetServiceBindings(s)
}()
go func() {
c5 <- GetOrganizations(s)
}()
go func() {
c6 <- GetSpaces(s)
}()
services := <- c1
servicePlans := <- c2
serviceInstances := <- c3
serviceBindings := <- c4
orgs := <- c5
spaces := <- c6
// stitch all the data together later
が、これを書くためのより良い方法があった場合、私は思っていました。
EDIT:それはまだ醜いですが、一つにチャンネル数を削減:
c := make(chan interface{})
var (
services map[string]Service
servicePlans map[string]ServicePlan
serviceInstances map[string]ServiceInstance
serviceBindings map[string]ServiceBinding
orgs map[string]Organization
spaces map[string]Space
)
go func() {
c <- GetServices(s)
}()
go func() {
c <- GetServicePlans(s)
}()
go func() {
c <- GetServiceInstances(s)
}()
go func() {
c <- GetServiceBindings(s)
}()
go func() {
c <- GetOrganizations(s)
}()
go func() {
c <- GetSpaces(s)
}()
for i := 0; i < 6; i++ {
v := <-c
switch v := v.(type) {
case map[string]Service:
services = v
case map[string]ServicePlan:
servicePlans = v
case map[string]ServiceInstance:
serviceInstances = v
case map[string]ServiceBinding:
serviceBindings = v
case map[string]Organization:
orgs = v
case map[string]Space:
spaces = v
}
}
私はまだ実際にこれを行う方法のようなので、私はループニーズことをハードコードする必要はありませんでしょう6回走る私は実際に実行するための関数のリストを作成し、それを繰り返すことを繰り返しましたgo func
呼び出しがすべての関数が異なる戻り値の型を持っているので、私はすべての型の不一致のエラーを持っていますし、func(api) interface{}
ランタイムパニックが発生するだけです。
あなたはチャンネルを使い過ぎているようです。リクエストがすでにコンカレントで、それぞれが1つのタイプの結果を返す場合、結果を受け取るためにさらに多くのゴルーチンとチャンネルが必要なのはなぜですか? – JimB
それはトリックですが、それぞれが異なるタイプの結果を返します –
クロージャで値を割り当てることができます:http://play.golang.org/p/Sak5QGCPZi、または以下に示唆したようにして汎用インターフェース{ }任意の型を受け取ります。 – JimB