// +build ignore package main import ( "go/ast" "go/build" "go/parser" "go/printer" "go/token" "os" "path/filepath" ) func main() { fset, files := parsePackage("net/http") id := "Handler" for _, f := range files { for _, decl := range f.Decls { decl, ok := decl.(*ast.GenDecl) if !ok || decl.Tok != token.TYPE { continue } for _, spec := range decl.Specs { spec := spec.(*ast.TypeSpec) if spec.Name.Name == id { printer.Fprint(os.Stdout, fset, spec) // HL } } } } } func parsePackage(path string) (*token.FileSet, []*ast.File) { pkg, err := build.Import(path, "", 0) if err != nil { panic(err) } fset := token.NewFileSet() var files []*ast.File for _, file := range pkg.GoFiles { f, err := parser.ParseFile(fset, filepath.Join(pkg.Dir, file), nil, 0) if err != nil { continue } files = append(files, f) } return fset, files }