Как я могу узнать, является ли параметр, имеющий интерфейс типа, структурой? - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть эта функция, которая принимает интерфейс {}

func MyFunk(itf interface{}) {
}

И я хотел бы знать, является ли передаваемый itf структурой, это возможно?Я пробовал несколько комбинаций отражения, и закрытие, которое я мог получить, было ptr (указатель).

Ответы [ 3 ]

0 голосов
/ 23 декабря 2018

Используйте следующее, чтобы определить, является ли аргумент структурой:

func MyFunk(itf interface{}) {
    v := reflect.ValueOf(itf)
    if v.Kind() == reflect.Struct {
        // it's a struct
    }
}

Если вы также хотите проверить наличие указателей на структуры, используйте этот код:

func MyFunk(itf interface{}) {
    v := reflect.Indirect(reflect.ValueOf(itf))
    if v.Kind() == reflect.Struct {
        // it's a struct
    }
}
0 голосов
/ 23 декабря 2018

Используя пакет reflect, вы можете проверять типы структур и указатели на структуры:

func MyFunk(itf interface{}) {
    t := reflect.TypeOf(itf)

    if t.Kind() == reflect.Struct {
        // itf is a struct
    } else if t.Kind() == reflect.Ptr {
        pt := t.Elem()
        if pt.Kind() == reflect.Struct {
            // itf is a pointer to a struct
        } else {
            // itf is a pointer to something else
        }
    } else {
        // itf is something else entirely
    }
}
0 голосов
/ 23 декабря 2018

Может быть Введите утверждения может помочь вам

func MyFunk(itf interface{}) {
    s, ok := itf.(MyStruct)
    fmt.Println(s, ok)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...