为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕森王 2021-11-22 10:26:28
见:http : //play.golang.org/p/GDCasRwYOp我需要根据结构字段的类型做一些事情。当字段为接口类型时,以下内容不起作用。我想我明白为什么这不起作用。但是有没有办法做我想做的事?package mainimport (    "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)        }    }}
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

也许这会让你去你想去的地方?


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())

        }

    }

}


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信