我正在尝试使用Go的解析器和ast包读取有关结构类型的Doc注释。在此示例中,代码仅将自身用作源。
package main import ( "fmt" "go/ast" "go/parser" "go/token" ) // FirstType docs type FirstType struct { // FirstMember docs FirstMember string } // SecondType docs type SecondType struct { // SecondMember docs SecondMember string } // Main docs func main() { fset := token.NewFileSet() // positions are relative to fset d, err := parser.ParseDir(fset, "./", nil, parser.ParseComments) if err != nil { fmt.Println(err) return } for _, f := range d { ast.Inspect(f, func(n ast.Node) bool { switch x := n.(type) { case *ast.FuncDecl: fmt.Printf("%s:\tFuncDecl %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc) case *ast.TypeSpec: fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc) case *ast.Field: fmt.Printf("%s:\tField %s\t%s\n", fset.Position(n.Pos()), x.Names, x.Doc) } return true }) } }
可以毫无问题地输出func和字段的注释文档,但是由于某种原因,找不到“ FirstType docs”和“ SecondType docs”。我想念什么?Go版本是1.1.2。
(要运行上面的代码,请将其保存到main.go文件中,然后单击go run main.go)
go run main.go
您需要使用该go/doc软件包从ast中提取文档:
go/doc
package main import ( "fmt" "go/doc" "go/parser" "go/token" ) // FirstType docs type FirstType struct { // FirstMember docs FirstMember string } // SecondType docs type SecondType struct { // SecondMember docs SecondMember string } // Main docs func main() { fset := token.NewFileSet() // positions are relative to fset d, err := parser.ParseDir(fset, "./", nil, parser.ParseComments) if err != nil { fmt.Println(err) return } for k, f := range d { fmt.Println("package", k) p := doc.New(f, "./", 0) for _, t := range p.Types { fmt.Println(" type", t.Name) fmt.Println(" docs:", t.Doc) } } }