2014-09-01 2 views
0

В Go я могу напечатать тип структуры на fmt.Printf("%T",Struct{}), однако это создает новую структуру и, следовательно, занимает память. Поэтому я могу просто напечатать fmt.Printf("main.Struct"), но тогда предположим, что кто-то реорганизует имя Struct, тогда инструкция печати не обновляется и код прерывается.Тип печати структуры без создания своего экземпляра

Как я мог напечатать тип структуры без создания своего экземпляра?

+1

Что вы на самом деле пытаетесь достичь? то есть, что будет печатать тип без создания справки о том, что вы делаете? – elithrar

+0

Это сообщение об ошибке 'errors.New (fmt.Sprintf (« ожидаемая структура типа% T, но при условии структуры типа% T », Struct {}, object))', поэтому никакой скрипт не сломается, но предоставленная информация будет вводить в заблуждение. Я задал общий вопрос, так как в некоторых случаях рефакторинг может нарушать и скрипты. – david

ответ

2

Будет всегда использовать отразить, чтобы получить название типа, периода.

Внутренне fmt.Printf("%T", x) использует reflect.TypeOf(x) (источник: http://golang.org/src/pkg/fmt/print.go#L721)

Использование можно использовать fmt.Sprintf, но он по-прежнему использует отражение + дополнительные накладные расходы на разбор строки формата.

name := fmt.Sprintf("%T", (*S)(nil))[1:] //lose the * 
// or 
name := reflect.TypeOf((*S)(nil)).String()[1:] 
+0

Почему бы не использовать 'Elem()'? – nemo

+0

@nemo 'Elem()' может использоваться только с пакетом 'reflect'. Но так как '% T' использует внутренний пакет' reflect', вероятно, нет необходимости избегать его использования напрямую. – david

+0

Зачем использовать его, поскольку вы уже знаете выход? – OneOfOne

1

Одним из решений является использование пакета reflect:

fmt.Printf("%v", reflect.TypeOf((*Struct)(nil)).Elem()) 

, который не создает какой-либо экземпляр структуры. Он напечатает main.Struct.

+0

Это более простое решение, не использующее отражение, вместо этого я соглашусь. – david

+0

, вы не встретите отражение, так как вы имеете дело с типом, которого вы не знаете. Вы можете проверить их с помощью переключателей типа, но в конце концов отражение - путь. – nemo

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