go/types

Guided tour · Go Tooling · pkg.go.dev →

Type-check Go packages. The backbone of `go vet`, staticcheck, gopls, and most analysis tooling.

Type-check a package

Config.Check

fset := token.NewFileSet()
file, _ := parser.ParseFile(fset, "x.go", src, 0)

info := &types.Info{
    Types: map[ast.Expr]types.TypeAndValue{},
    Defs:  map[*ast.Ident]types.Object{},
    Uses:  map[*ast.Ident]types.Object{},
}

conf := types.Config{Importer: importer.Default()}
pkg, err := conf.Check("p", fset, []*ast.File{file}, info)
if err != nil { log.Fatal(err) }
fmt.Println(pkg.Name(), pkg.Scope().Names())

Querying the info

Type of an expression

for expr, tv := range info.Types {
    fmt.Println(types.ExprString(expr), "::", tv.Type)
}

Resolve an identifier

for id, obj := range info.Uses {
    fmt.Println(id.Name, "->", obj)
}