Heim > Backend-Entwicklung > Golang > Wie kann ich Pakettypen dynamisch in Go erkennen?

Wie kann ich Pakettypen dynamisch in Go erkennen?

DDD
Freigeben: 2024-12-15 12:51:24
Original
725 Leute haben es durchsucht

How Can I Discover Package Types Dynamically in Go?

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)
    }
}
Nach dem Login kopieren

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
    })
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage