2017-01-28 5 views
1

Скажем, у меня есть следующий тип, определенный:Как получить строковое представление типа?

type ID uuid.UUID 

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

fmt.Sprintf("%T", ID{}) 

который я дон Это совсем не так, потому что оно создает его, также из интерфейса.

ответ

2

Вы можете использовать пакет 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

Смежные вопросы