Maison >développement back-end >Golang >Comment puis-je découvrir les types de packages de manière dynamique dans Go ?

Comment puis-je découvrir les types de packages de manière dynamique dans Go ?

DDD
DDDoriginal
2024-12-15 12:51:24723parcourir

How Can I Discover Package Types Dynamically in Go?

Recherche dynamique des types de packages

Malgré l'absence de mécanismes de découverte de types dans le package Reflect, d'autres méthodes existent pour découvrir les types exportés, en particulier les structures , au moment de l'exécution.

Go 1.5 et Plus tard

Dans Go 1.5 et versions ultérieures, les types et les packages d'importation peuvent vous aider dans cette tâche. L'extrait de code suivant illustre le processus :

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)
    }
}

Versions pré-1.5

Avant Go 1.5, le package ast fournit la seule approche non hackée à ce problème. . En compilant le code source, ce package peut extraire des informations de type :

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
    })
}

Ces techniques permettent la découverte de types exportés, en particulier les structures, dans les packages Go en cours d'exécution, permettant une analyse plus approfondie et une instanciation des instances.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn