Как передать тип в аргумент функции - PullRequest
0 голосов
/ 29 июня 2018

ОШИБКА: тип CustomStruct не является выражением.

type CustomStruct struct {
}

func getTypeName(t interface{}) string {
    rt := reflect.TypeOf(t).Elem()
    return rt.Name()
}

getTypeName(CustomStruct)

Как передать структурный тип в функцию без экземпляра типа?

Это будет работать

getTypeName((*CustomStruct)(nil))

Но мне интересно, есть ли более простая версия ..

1 Ответ

0 голосов
/ 29 июня 2018

Вы не можете. Вы можете передавать только значение, и CustomStruct - это не значение, а тип. Использование идентификатора типа является ошибкой во время компиляции.

Обычно, когда нужно передать тип, вы передаете значение reflect.Type, которое описывает тип. Это то, что вы «создаете» внутри getTypeName(), но тогда у getTypeName() мало что остается сделать:

func getTypeName(t reflect.Type) string {
    return t.Name()
}

// Calling it:
getTypeName(reflect.TypeOf(CustomStruct{}))

(Также не забывайте, что это возвращает пустую строку для анонимных типов, таких как []int.)

Другой способ - передать «типизированное» значение указателя nil, как вы это делали, но опять же, вы также можете использовать типизированное значение nil для создания reflect.Type, не создавая значения введите вопрос, например, так:

t := reflect.TypeOf((*CustomStruct)(nil)).Elem()
fmt.Println(t.Name()) // Prints CustomStruct
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...