Как обнаружить все типы пакетов во время выполнения?

Насколько я знаю (см.Вот, а такжеВот) нет механизма обнаружения типов вотражать пакет, который ожидает, что у вас уже есть экземпляр типа или значения, которое вы хотите проверить.

Есть лиДругой способ обнаружить все экспортированные типы (особенно структуры) в работающем пакете 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() для типов, которые включают ожидаемый тип библиотеки.

Ответы на вопрос(4)

Ваш ответ на вопрос