Go のパーサーと ast パッケージを使用して構造体型に関連付けられたドキュメント コメントを抽出しようとすると、型構造自体のコメントは見つかりません。関数とフィールドのコメントは存在しますが、FirstType と SecondType という名前の型のドキュメントがありません。
この問題は、Go パーサーのデフォルトの解析動作が機能しないために発生します。ドキュメントのコメントを抽象構文ツリー (AST) の TypeSpec ノードに関連付けます。 TypeSpec に遭遇すると、パーサーは現在の Doc コメント ノードを消費し、AST から削除します。
純粋な AST でコメントを解析します
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.Text()) case *ast.TypeSpec: fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, x.Doc.Text()) case *ast.Field: fmt.Printf("%s:\tField %s\t%s\n", fset.Position(n.Pos()), x.Names, x.Doc.Text()) case *ast.GenDecl: fmt.Printf("%s:\tGenDecl %s\n", fset.Position(n.Pos()), x.Doc.Text()) } return true }) }
ケースを追加ast.GenDecl を AST 検査関数に渡します。これにより、GenDecl ノードに関連付けられたドキュメント コメントがチェックされます。ここには、型定義が複数の個別の定義の短縮形である特殊なケースで、型定義のコメントが保存されます。
ただし、このアプローチは満足のいくものではありません。ドキュメントのコメントは、AST 内の対応する TypeSpec ノードに添付されません。
推奨される解決策: go/doc を使用します
import ( "go/doc" ) func main() { d, err := doc.ParseDir("./", nil, doc.AllDecls) if err != nil { fmt.Println(err) return } for _, info := range d { ast.Inspect(info.Decl, func(n ast.Node) bool { switch x := n.(type) { // ... inspecting cases for functions, fields, etc. case *ast.TypeSpec: fmt.Printf("%s:\tTypeSpec %s\t%s\n", fset.Position(n.Pos()), x.Name, info.Doc) } return true }) } }
go/doc を使用すると、解析および取得するための標準化された包括的な方法が提供されます。構造体の型を含むすべての型のドキュメント コメント。これは、ドキュメント コメントが GenDecl ノードにアタッチされている場合を処理し、コメントと AST 内の対応するノードとの適切な関連付けを保証します。
以上がGo Parser が型構造に関するコメントを検出できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。