Pakettypen dynamisch finden
Obwohl im Reflect-Paket keine Mechanismen zur Typerkennung vorhanden sind, gibt es andere Methoden zum Erkennen exportierter Typen, insbesondere von Strukturen , zur Laufzeit.
Go 1.5 und Später
In Go 1.5 und höher können die Typen und Importerpakete bei dieser Aufgabe helfen. Das folgende Code-Snippet demonstriert den Prozess:
package main import ( "fmt" "go/importer" ) func main() { pkg, err := importer.Default().Import("time") if err != nil { fmt.Printf("error: %s\n", err.Error()) return } for _, declName := range pkg.Scope().Names() { fmt.Println(declName) } }
Versionen vor 1.5
Vor Go 1.5 bietet das ast-Paket den einzigen nicht hackigen Ansatz für dieses Problem . Durch Kompilieren des Quellcodes kann dieses Paket Typinformationen extrahieren:
package main import ( "fmt" "go/ast" "go/parser" "go/token" ) func main() { fset := token.NewFileSet() node, err := parser.ParseFile(fset, "time.go", nil, parser.ParseComments) if err != nil { fmt.Printf("error: %s\n", err.Error()) return } ast.Inspect(node, func(n ast.Node) bool { if n, ok := n.(*ast.TypeSpec); ok { fmt.Println(n.Name.Name) } return true }) }
Diese Techniken ermöglichen die Erkennung exportierter Typen, insbesondere Strukturen, innerhalb laufender Go-Pakete und ermöglichen so eine weitere Analyse und Instanziierung von Instanzen.
Das obige ist der detaillierte Inhalt vonWie kann ich Pakettypen dynamisch in Go erkennen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!