В golang возможно ли получить отражение? Тип от самого типа, от имени как строки? - PullRequest
30 голосов
/ 17 июня 2011
type t1 struct { i int; s string }
var v1 reflect.Type = /* how to set to t1's reflect.Type? */
  1. возможно ли получить отражение. Тип t1 без необходимости его создания?

  2. возможно ли получить отражение. Тип t1, если его имя "t1" в виде строки?

1 Ответ

47 голосов
/ 18 июня 2011

1, да, вроде:

var v1 reflect.Type = reflect.TypeOf((*t1)(nil)).Elem()
fmt.Println(v1)  // prints "main.t1"

Инстанцирование не требуется.Однако в Go нет литералов типа, что, я думаю, вы и просите.Чтобы получить значение типа во время выполнения, вам нужно иметь какое-то значение.Если вы не хотите или не можете создать значение во время выполнения, вы можете извлечь его из напечатанного nil.Если вам не нравится идея искать это каждый раз, вы можете сохранить этот тип времени выполнения в переменной.

На 2, нет, не совсем.Это потребовало бы, чтобы среда выполнения Go поддерживала карту всех типов в текущем двоичном файле, что имеет ряд проблем.Вы можете создать пакет реестра типов и зарегистрировать все типы, которые вы можете захотеть получить по строке, но это всегда будет неполным, и если вы знаете, какой тип вам нужен, вы всегда можете просто использовать TypeOf.Ситуация несколько усложняется тем фактом, что вы можете иметь анонимные типы, а имя типа «t1» не обязательно будет уникальным, поскольку другой пакет может иметь тип с таким же именем.Для среды выполнения Go возможно предоставить функцию, которая дает тип из строкового имени, но я сомневаюсь, что это произойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...