假设我有下面的代码,
package w
import "log"
type Z struct {
log.Logger
}
type Y struct {} // skip this type
我想以编程方式查找类型,由它嵌入的事实标识,如果它没有,我想跳过声明,使用 https://pkg.go.dev/golang.org/x/tools/go/packagesZlog.Logger
目前我已经能够编写以下代码,
package main
import (
"fmt"
"go/ast"
"go/token"
"os"
"path/filepath"
"golang.org/x/tools/go/packages"
)
func main() {
inputFile := os.Getenv("GOFILE")
cwd, err := os.Getwd()
if err != nil {
panic(err)
}
fmt.Println(inputFile)
fmt.Println(cwd)
cfg := &packages.Config{
// Mode: packages.NeedName | packages.NeedFiles | packages.NeedSyntax | packages.LoadTypes,
Mode: packages.NeedSyntax | packages.LoadTypes,
BuildFlags: []string{"-tags=sqlg"},
}
pkgs, err := packages.Load(cfg, cwd)
if err != nil {
fmt.Fprintf(os.Stderr, "load: %v\n", err)
os.Exit(1)
}
if packages.PrintErrors(pkgs) > 0 {
os.Exit(1)
}
for _, pkg := range pkgs {
fmt.Println(pkg.ID, pkg.GoFiles)
for _, s := range pkg.Syntax {
file := pkg.Fset.File(s.Pos())
if filepath.Base(file.Name()) != inputFile {
continue
}
for _, d := range s.Decls {
switch x := d.(type) {
case *ast.GenDecl:
if x.Tok == token.TYPE {
fmt.Printf("%#v\n", x.Specs)
}
case *ast.FuncDecl:
}
}
}
}
}
但我不太喜欢它,因为我正在挖掘语法树,寻找GenDecl,然后是Specs等
以前,使用包加载器可以加载类型推断,搜索每个包的类型并检查接口兼容性;它对我来说很满意,我想要类似的东西。https://godoc.org/golang.org/x/tools/go/loader
如何使用新的包包来查找类型,因为它们嵌入了简单的特定类型?
慕勒3428872
智慧大石
相关分类