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