2

構造体があり、そのキーを取得したいのですが、現在はタイプの場合、interface{}どうすればよいですか?

現在、次のコンパイルエラーが発生します。

invalid operation: d[label] (index of type interface {})

再生: http: //play.golang.org/p/PLr91d55GX

package main

import "fmt"
import "reflect"

type Test struct {
    s string
}

func main() {
    test := Test{s: "blah"}
    fmt.Println(getProp(test, "s"))
}

func getProp(d interface{}, label string) (interface{}, bool) {
    switch reflect.TypeOf(d).Kind() {
    case reflect.Struct:
        _, ok := reflect.TypeOf(d).FieldByName(label)
        if ok {
                    // errors here because interface{} doesn't have index of type 
            return d[label], true
        } else {
            return nil, false
        }
    }
}

私は本当にそれぞれの異なるタイプで大規模なcaseステートメントを実行し、reflectedreflect.ValueOf(x).String()などを呼び出す必要がありますか?もっとエレガントな方法があるといいのですが。

4

2 に答える 2

2

これは可能ですが、構造体メンバーがエクスポートされたフィールドである場合にのみ機能すると思いますs(つまり、例では大文字を使用Sします)

func getProp(d interface{}, label string) (interface{}, bool) {
    switch reflect.TypeOf(d).Kind() {
    case reflect.Struct:
        v := reflect.ValueOf(d).FieldByName(label)
             return v.Interface(), true
    }
   return nil, false
}

(+さらにいくつかのエラー処理)

于 2012-12-13T10:18:15.093 に答える
0

何を探しているのか正確にはわかりませんが、interface{}タイプを探すための少し簡単な方法があります。あなたの場合、あなたは以下を使うことができます:

switch val := d.(type) {
  case Test:
    fmt.Println(d.s)
}

明らかに、私はあなたと同じことをしていませんが、アイデアは「d。(type)」でタイプをチェックでき、「case Test:」がテストタイプの構造体であると判断すると、 、そのままアクセスできます。

残念ながら、これはラベルによる構造体内の値へのアクセスに対応していませんが、少なくともタイプを決定するためのより洗練された方法であり、@nosはそれを行う方法を示しています

v := reflect.ValueOf(d).FieldByName(label)
return v.Interface(), true
于 2012-12-13T16:23:15.763 に答える