Проверьте, имеет ли структура встраивание структуры во время выполнения - PullRequest
0 голосов
/ 04 мая 2020

Допустим, у меня есть следующая структура:

type Room struct {
  BaseModel
}

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

Скажем, в другом месте кода я получил объект r. Это может быть Room или что-то еще. Я хочу проверить во время выполнения, имеет ли класс r, в данном случае Room, структурное вложение BaseModel. Это возможно?

Ответы [ 2 ]

1 голос
/ 04 мая 2020

Да, вы можете проверить это во время выполнения, используя отражение. Вот очень простой пример, который использует reflect.TypeOf для печати типа каждого поля struct Bar, в которое встраивается struct Foo, а также reflect.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))
    }
}

Вот код на детской площадке: https://play.golang.org/p/zNWxZUzq_RS

Вы не спрашиваете, что именно вы хотите делать с этой информацией поэтому указываем вам reflect документацию для более продвинутого использования.

1 голос
/ 04 мая 2020

Проверьте поле 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...