Как обнаружить все типы пакетов во время выполнения?
Насколько я знаю (см.Вот, а такжеВот) нет механизма обнаружения типов вотражать пакет, который ожидает, что у вас уже есть экземпляр типа или значения, которое вы хотите проверить.
Есть лиДругой способ обнаружить все экспортированные типы (особенно структуры) в работающем пакете go?
Вот что я хотел бы иметь (но он не существует):
import "time"
import "fmt"
func main() {
var types []reflect.Type
types = reflect.DiscoverTypes(time)
fmt.Println(types)
}
Конечная цель состоит в том, чтобы иметь возможность обнаружить все структуры пакета, которые соответствуют определенным критериям, а затем создать новые экземпляры этих структур.
Кстати, функция регистрации, которая идентифицирует типыне правильный подход для моего варианта использования.
Считаете ли вы, что это хорошая идея или нет, вот почему я хочу эту возможность (потому что я знаю, что вы спросите):
Я написалутилита генерации кода загружает исходные файлы go и создает AST для сканирования типов, в которые встроен указанный тип. Вывод утилиты представляет собой набор функций тестирования, основанных на обнаруженных типах. Я вызываю эту утилиту, используяgo generate
чтобы создать тестовые функции, затем запуститеgo test
выполнить сгенерированные тестовые функции. Каждый раз, когда тесты меняются (или добавляется новый тип), я должен перезапускаться, генерировать перед повторным запускомgo test
, Вот почему функция регистрации не является допустимой опцией. Я хотел бы избежатьgo generate
шаг, но это потребовало бы, чтобы моя утилита стала библиотекой, импортируемой запущенным пакетом. Код библиотеки должен каким-то образом сканировать работающее пространство имен во времяinit()
для типов, которые включают ожидаемый тип библиотеки.