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