ホームページ >バックエンド開発 >Golang >Go でパッケージ タイプを動的に検出するにはどうすればよいですか?

Go でパッケージ タイプを動的に検出するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-15 12:51:24725ブラウズ

How Can I Discover Package Types Dynamically in Go?

パッケージ型の動的検索

reflect パッケージには型検出メカニズムがないにもかかわらず、エクスポートされた型、特に構造体を検出するための他の方法が存在します。 、実行時。

Go 1.5 と後で

Go 1.5 以降では、タイプとインポーター パッケージがこのタスクを支援できます。次のコード スニペットはプロセスを示しています。

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

1.5 より前のバージョン

Go 1.5 より前では、ast パッケージはこの問題に対する唯一の非ハックなアプローチを提供します。 。ソース コードをコンパイルすることで、このパッケージは型情報を抽出できます。

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

これらの手法により、実行中の Go パッケージ内でエクスポートされた型、特に構造体を検出できるようになり、インスタンスのさらなる分析とインスタンス化が可能になります。

以上がGo でパッケージ タイプを動的に検出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。