構造体フィールドで型スイッチを使用するにはどうすればよいですか(フィールドがインターフェイス型の場合)?

Ziffusion:

参照:http : //play.golang.org/p/GDCasRwYOp

構造体フィールドのタイプに基づいて処理を行う必要があります。

フィールドがインターフェイス型の場合、以下は機能しません。

なぜこれが機能しないのか理解できると思います。しかし、私がやりたいことをする方法はありますか?

package main

import (
    "fmt"
    "reflect"
)

type TT struct {
    Foo int
}

type II interface {
    Bar(int) (int, error)
}

type SS struct {
    F1 TT
    F2 II
}

func main() {
    var rr SS
    value := reflect.ValueOf(rr)
    for ii := 0; ii < value.NumField(); ii++ {
        fv := value.Field(ii)
        xv := fv.Interface()
        switch vv := xv.(type) {
        default:
            fmt.Printf("??: vv=%T,%v\n", vv, vv)
        case TT:
            fmt.Printf("TT: vv=%T,%v\n", vv, vv)
        case II:
            fmt.Printf("II: vv=%T,%v\n", vv, vv)
        }
    }
}
ホッブズ:

多分これはあなたが行きたい場所を取得しますか?

func main() {
    var rr SS
    typ := reflect.TypeOf(rr)
    TTType := reflect.TypeOf(TT{})
    IIType := reflect.TypeOf((*II)(nil)).Elem() // Yes, this is ugly.

    for ii := 0; ii < typ.NumField(); ii++ {
        fv := typ.Field(ii)
        ft := fv.Type
        switch {   
        case ft == TTType:
            fmt.Printf("TT: %s\n", ft.Name())
        case ft.Implements(IIType):
            fmt.Printf("II: %s\n", ft.Name())
        default:
            fmt.Printf("??: %s %s\n", ft.Kind(), ft.Name())
        }
    }
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ