【问题标题】:How do I use type switch on struct fields (when field is of interface type)?如何在结构字段上使用类型开关(当字段是接口类型时)?
【发布时间】:2016-02-01 04:37:48
【问题描述】:

见: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)
        }
    }
}

【问题讨论】:

    标签: go interface type-switch


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2022-11-10
      • 1970-01-01
      • 2017-10-07
      相关资源
      最近更新 更多