Вы можете использовать пакет reflect
(пакет fmt
делает это тоже под капотом). Вы можете начать с указателя к типу, а также использовать набранного nil
значения указателя без выделения, и вы можете перемещаться от его reflect.Type
дескриптора в дескриптор базового типа (или элемента типа) указатель с использованием Type.Elem()
.
Пример:
t := reflect.TypeOf((*ID)(nil)).Elem()
name := t.Name()
fmt.Println(name)
Output (попробуйте на Go Playground):
ID
Примечание: помните, что Type.Name()
может возвращать пустой string
(если Type
представляет неназванного типа). Если вы используете type declaration (с ключевым словом type
), то вы уже назвали этот тип, поэтому Type.Name()
вернет непустое имя типа. Но, используя приведенный выше код для переменной типа *[]string
, например, даст вам пустую строку:
var s *[]string
t := reflect.TypeOf(s).Elem()
name := t.Name()
fmt.Printf("%q", name)
Output (попробовать его на Go Playground):
""
Показать похожие вопросы:
Golang reflect: Get Type representation from name?
Identify non builtin-types using reflect