Soweit ich weiß (siehe here und here) gibt es keinen Typ Discovery-Mechanismus in der reflect package, die erwartet, dass Sie bereits eine Instanz des Typs oder Werts, den Sie überprüfen möchten.Go (reflect): Wie erkennt man alle Pakettypen zur Laufzeit?
Gibt es eine andere Möglichkeit, alle exportierten Typen (vor allem die Strukturen) in einem laufenden Go-Paket zu entdecken?
Hier ist, was ich wünschte, ich hätte (aber es existiert nicht):
import "time"
import "fmt"
func main() {
var types []reflect.Type
types = reflect.DiscoverTypes(time)
fmt.Println(types)
}
Das Endziel ist in der Lage sein, alle Strukturen eines Pakets zu entdecken, die bestimmte Kriterien erfüllen, dann in der Lage sein, um neue Instanzen dieser Strukturen zu instanziieren.
BTW, eine Registrierungsfunktion, die die Typen identifiziert, ist nicht ein gültiger Ansatz für meinen Anwendungsfall.
Ob Sie denken, es ist eine gute Idee ist oder nicht, hier ist, warum ich diese Fähigkeit wollen (weil ich weiß, Sie gehen fragen):
Ich habe geschrieben eine code generation utility, die Lasten gehen Quelldateien und erstellt eine AST zum Suchen nach Typen, die einen bestimmten Typ einbetten. Die Ausgabe des Dienstprogramms besteht aus einer Reihe von Go-Testfunktionen, die auf den erkannten Typen basieren. Ich rufe dieses Dienstprogramm mit go generate
auf, um die Testfunktionen zu erstellen, und führe dann go test
aus, um die generierten Testfunktionen auszuführen. Jedes Mal, wenn sich die Tests ändern (oder ein neuer Typ hinzugefügt wird), muss ich erneut go generieren ausführen, bevor go test
erneut ausgeführt wird. Aus diesem Grund ist eine Registrierungsfunktion keine gültige Option. Ich möchte den Schritt go generate
vermeiden, aber dazu müsste mein Dienstprogramm eine Bibliothek werden, die vom laufenden Paket importiert wird. Der Bibliothekscode müsste den laufenden Namespace während init()
nach Typen durchsuchen, die den erwarteten Bibliothekstyp einbetten.
Das einzige, worüber ich nachdenken kann, ist das Erzeugen von Code, der eine Registerfunktion in 'init()' für Sie aufruft. – THUNDERGROOVE
Yeah @THUNDERGROOVE, das ist im Grunde, was ich implementiert habe. Aber ich möchte keinen Code generieren. Ich lasse eher 'go test' laufen und lasse die Bibliothek alle Typen entdecken, instantiieren und dann aufrufen. Alles in einem Prozess ausgeführt. Es ist ein doozy des Problems. – mdwhatcott