Go 如何在结构字段上使用类型开关(当字段为接口类型时)?

Go 如何在结构字段上使用类型开关(当字段为接口类型时)?,go,interface,type-switch,Go,Interface,Type Switch,见: 我需要根据结构字段的类型进行操作 当字段为接口类型时,以下操作不起作用 我想我明白为什么这不起作用了。但有没有办法做我想做的事 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()

见:

我需要根据结构字段的类型进行操作

当字段为接口类型时,以下操作不起作用

我想我明白为什么这不起作用了。但有没有办法做我想做的事

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)
        }
    }
}
主程序包
进口(
“fmt”
“反映”
)
类型TT结构{
福因特
}
II型接口{
条形图(整数)(整数,错误)
}
类型SS结构{
F1 TT
F2 II
}
func main(){
var-rr-SS
值:=reflect.ValueOf(rr)
对于ii:=0;ii
也许这能让你达到你想去的地方

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())
        }
    }
}
func main(){
var-rr-SS
类型:=反射类型(rr)
TTType:=reflect.TypeOf(TT{})
IIType:=reflect.TypeOf((*II)(nil)).Elem()//是的,这很难看。
对于ii:=0;ii