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

标签 go

假设我有以下结构:

type Room struct {
  BaseModel
}

func main() {
  r := Room{}
}

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

最佳答案

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

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

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

你不会问你到底想用这些信息做什么,所以你会指向 reflect documentation用于更高级的用途。

关于go - 在运行时检查结构是否具有结构嵌入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61585699/

相关文章:

multithreading - 工作池模式 - 死锁

google-app-engine - API 错误 1 ​​(datastore_v3 : BAD_REQUEST): ApplicationError: 1 app "id1" cannot access app "id2"'s data

go - 如何从 mux in go 获取可用路由?

go - 如何理解core/types/block.go中的 'rlpHash'方法

c - 类型安全与松散类型 - GO 与 C

go - 如何确定变量是 slice 还是数组?

sql - 我们可以将额外的参数传递给 beego 路由器吗

go - 为什么将math.MaxInt64推断为int32?

jenkins - 将 Go 测试输出转换为 XUnit

go - 如何在生产模式下在https中运行Beego二进制文件?