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

假设我有以下结构:


type Room struct {

  BaseModel

}


func main() {

  r := Room{}

}

在代码的其他地方说我获得了一个对象 r。它可能是Room或其他东西。我想在运行时检查 r 的类(在这种情况下Room)是否具有 BaseModel 的结构嵌入。那可能吗?


达令说
浏览 121回答 2
2回答

墨色风雨

是的,您可以使用反射在运行时检查它。这是一个非常简单的示例,用于打印嵌入结构reflect.TypeOf的每个字段的类型,并打印字段是否为匿名() - 这是您要求的一个很好的指标:BarFooreflect.ValueOftruepackage mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "reflect")type Foo struct {&nbsp; &nbsp; foo string}type Bar struct {&nbsp; &nbsp; Foo&nbsp; &nbsp; bar string}func main() {&nbsp; &nbsp; test := Bar{}&nbsp; &nbsp; t := reflect.TypeOf(test)&nbsp; &nbsp; for i := 0; i < t.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Print(t.Field(i).Type, " ")&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(reflect.ValueOf(t.Field(i).Anonymous))&nbsp; &nbsp; }}这是操场上的代码:https: //play.golang.org/p/zNWxZUzq_RS你不会问你到底想用这些信息做什么,所以将你指向reflect文档以进行更高级的使用。

拉丁的传说

检查 的Anonymous字段reflect.StructField。func embedsBaseModel(v interface{}) bool {&nbsp; &nbsp; rt := reflect.TypeOf(v)&nbsp; &nbsp; if rt.Kind() != reflect.Struct {&nbsp; &nbsp; &nbsp; &nbsp; return false&nbsp; &nbsp; }&nbsp; &nbsp; base := reflect.TypeOf(BaseModel{})&nbsp; &nbsp; for i := 0; i < rt.NumField(); i++ {&nbsp; &nbsp; &nbsp; &nbsp; if sf := rt.Field(i); sf.Type == base && sf.Anonymous {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return false}https://play.golang.com/p/-6flZcdSYwj
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go