2013-12-21 17 views
10

"反射"パッケージの関数呼び出しからこの戻り値を取得しています。値の型をGolangのMapに変換しますか?

< map[string]string Value >

戻り値の中で実際のマップにアクセスできるかどうか、もしそうなら、どうすればよいですか?

EDIT:

私はバリューオブジェクトを返す呼び出しを行うよどこだから、これはあります。 [< map[string]string Value >]を返します。この配列には、最初のオブジェクトを取得します。しかし、[< map[string]string Value >]を通常のマップに変換する方法がわかりません。

view_args := reflect.ValueOf(&controller_ref).MethodByName(action_name).Call(in) 
+1

もう少しコードサンプルをいただけますか? –

+0

編集: – user1493543

答えて

14

大半は、Valueオブジェクトが.Interface() methodを使用してinterface{}値に変換することができます反映されます。

この値を取得したら、必要なマップに戻すことができます。実施例(play):上記の例で

m := map[string]int{"foo": 1, "bar": 3} 
v := reflect.ValueOf(m) 
i := v.Interface() 
a := i.(map[string]int) 

println(a["foo"]) // 1 

mは、元のマップとv反射値です。 Interfaceメソッドによって取得されたインタフェース値iは、タイプmap[string]intであるとアサートされ、この値は最後の行でそのまま使用されます。

+1

パーフェクト、私は確かに下の作品も、これは私が必要としたものです。ありがとうございます:) – user1493543

7

reflect.Valueの値をinterface{}にするには、iface := v.Interface()を使用します。それにアクセスするには、type assertionまたはtype switchを使用します。

あなたがmap[string]stringを取得していることがわかっている場合、アサーションは単にm := iface.(map[string]string)です。あなたは、コードで出興味すべてのコンクリートの型を書き出すことができる場合にのみ機能することを、

もちろん
switch item := iface.(type) { 
case map[string]string: 
    fmt.Println("it's a map, and key \"key\" is", item["key"]) 
case string: 
    fmt.Println("it's a string:", item) 
default: 
    // optional--code that runs if it's none of the above types 
    // could use reflect to access the object if that makes sense 
    // or could do an error return or panic if appropriate 
    fmt.Println("unknown type") 
} 

:可能性のほんの一握りがある場合、それらすべてを処理するタイプのスイッチは次のようになります。コンパイル時に可能な型がわからない場合は、とv.MapIndex(key)のようなメソッドを使用してreflect.Valueでさらに作業しなければなりません。そして、私の経験では、これは長時間のものです。the reflect docsであり、 。

+0

答えをありがとう! – user1493543

関連する問題