亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在結構字段上使用類型開關(當字段為接口類型時)?

如何在結構字段上使用類型開關(當字段為接口類型時)?

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 關注
  • 118 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號