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

检查结构在运行时是否具有结构嵌入

检查结构在运行时是否具有结构嵌入

Go
达令说 2022-06-01 16:13:43
假设我有以下结构:type Room struct {  BaseModel}func main() {  r := Room{}}在代码的其他地方说我获得了一个对象 r。它可能是Room或其他东西。我想在运行时检查 r 的类(在这种情况下Room)是否具有 BaseModel 的结构嵌入。那可能吗?
查看完整描述

2 回答

?
墨色风雨

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

是的,您可以使用反射在运行时检查它。这是一个非常简单的示例,用于打印嵌入结构reflect.TypeOf的每个字段的类型,并打印字段是否为匿名() - 这是您要求的一个很好的指标:BarFooreflect.ValueOftrue


package main


import (

    "fmt"

    "reflect"

)


type Foo struct {

    foo string

}


type Bar struct {

    Foo

    bar string

}


func main() {

    test := Bar{}

    t := reflect.TypeOf(test)


    for i := 0; i < t.NumField(); i++ {

        fmt.Print(t.Field(i).Type, " ")

        fmt.Println(reflect.ValueOf(t.Field(i).Anonymous))

    }

}

这是操场上的代码:https: //play.golang.org/p/zNWxZUzq_RS


你不会问你到底想用这些信息做什么,所以将你指向reflect文档以进行更高级的使用。


查看完整回答
反对 回复 2022-06-01
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

检查 的Anonymous字段reflect.StructField。


func embedsBaseModel(v interface{}) bool {

    rt := reflect.TypeOf(v)

    if rt.Kind() != reflect.Struct {

        return false

    }


    base := reflect.TypeOf(BaseModel{})

    for i := 0; i < rt.NumField(); i++ {

        if sf := rt.Field(i); sf.Type == base && sf.Anonymous {

            return true

        }

    }

    return false

}

https://play.golang.com/p/-6flZcdSYwj


查看完整回答
反对 回复 2022-06-01
  • 2 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

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