ホームページ  >  記事  >  バックエンド開発  >  Go パーサーが構造体型のドキュメント コメントを検出しないのはなぜですか?

Go パーサーが構造体型のドキュメント コメントを検出しないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-07 19:32:021032ブラウズ

Why is My Go Parser Not Detecting Doc Comments on Struct Types?

Go パーサーが構造体型の Doc コメントを検出しない

Go では、構造体型に関連付けられた Doc コメントを識別することができます。パーサーと ast パッケージ。これらのコメントが検出されない理由についての調査は次のとおりです:

問題

質問で提供されているソース コードは、次を使用して構造体型の Doc コメントを取得しようとする試みを示しています。 Go のパーサー パッケージ。ただし、構造体型 FirstType と SecondType のドキュメント コメントが出力にありません。

解決策

これを解決するには、Go がドキュメントをどのように処理するかを検討する必要があります。抽象構文ツリー (AST) 内にあります。 go/doc パッケージは、TypeSpec に添付されたドキュメントがない場合、代わりに親 GenDecl のドキュメントを使用する必要があることを示唆しています。

GenDecls の検査

*ast.GenDecl:

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)
        case *ast.GenDecl:
            fmt.Printf("%s:\tGenDecl %s\n", fset.Position(n.Pos()), x.Doc)
        }

        return true
    })
}

このコードを実行すると、FirstType と SecondType の欠落しているドキュメント コメントが生成されます。

予期しない動作

このメソッドは、欠落している Doc コメントを明らかにしますが、GenDecl のドキュメントが意図せずに含まれていることも明らかにします。これは、AST が構造体の型定義を括弧で囲まれた型定義の短縮形として認識し、グループ化に関係なくすべての定義を同様に処理するためです。

結論

Doc を効果的に取得するには純粋な AST を使用する構造体型のコメントでは、この動作を認識することが重要です。ただし、go/doc パッケージを使用することは、これらの複雑さを回避し、Go でのドキュメント解析のための包括的なソリューションを提供するため、引き続き推奨されるアプローチです。

以上がGo パーサーが構造体型のドキュメント コメントを検出しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。