0
私は、ユーザーが1)Goファイルを含むディレクトリを指定するコマンドラインアプリケーションを作成しています。2)変数名はhttp.Handler
動的に指定されたGo変数に特定の型があるかどうかを確認します。
go run cli.go /path/to/a/go/library MyCustomHandler
は私が
- にしようとしている
- はそれが私が最初に行うことができます
http.Handler
だことを確認してください2つの問題はありません - 私はparser.ParseDir
と呼んで、私が希望するパッケージを*ast.Package
、t
func findHttpHandler(pkg *ast.Package, handlerName string) (*ast.FuncDecl, error) {
for _, file := range pkg.Files {
for _, decl := range file.Decls {
gd, ok := decl.(*ast.GenDecl)
if !ok || gd.Tok != token.VAR {
continue
}
if len(gd.Specs) != 1 {
continue
}
spec0 := gd.Specs[0]
vs, ok := spec0.(*ast.ValueSpec)
if !ok {
continue
}
if len(vs.Names) != 1 {
continue
}
ident := vs.Names[0]
if ident.Name != handlerName {
continue
}
// ...
}
}
}
問題は、この時点でValueSpec.Type
がnilされ、これはhttp.Handler
であるかどうかを把握するためにどのような方法があるように表示されません。このような、それ以上の鶏ループ。
go/types
パッケージにはタイプを確認するためのツールがありますが、プログラム全体を解析してタイプチェックするためには、さらに多くの設定作業が必要になるようです。私はこの道を行く必要があるのでしょうか、それとももっと簡単な方法ですか、ちょうどパッケージを使用していますか、何とかgo build
を使用していますか?
こんにちはケビンを期待して、いくつかのトレースを行なったし、方法を見つけます! :)それはこの質問に近いと思われる:http://stackoverflow.com/questions/27976493/golang-static-identifier-resolution 私はそれが助けてくれることを望む。 – gbin