Go プログラミング言語の継続的な開発により、メインのプログラミング言語として Go を選択するプログラマーがますます増えています。 Go 1.17 から、新しい go/doc
パッケージが Go 言語標準ライブラリに追加されました。これにより、Golang がコメントを取得することがより簡単かつ便利になります。
この記事では、go/doc
パッケージを使用して Golang ソース コード内のコメントを取得する方法を検討します。次の側面から説明します。
パッケージの基本的な使い方
go/doc パッケージの基本的な使用法
go/doc パッケージは Go 言語の標準ライブラリに付属するパッケージで、インストールせずに使用できます。このパッケージは、Golang ソース コードから注釈情報を解析する非常に簡単な方法を提供します。
go/doc パッケージをインポートし、
go/doc.
New(pak *ast.Package, importPath string, modeモード ) 関数を使用して、
go/doc.
Package タイプのオブジェクトを作成します。この関数の最初のパラメータは、アノテーションを取得する Go パッケージを表す
*ast.Package 型のポインタで、2 番目のパラメータは文字列型で、インポートするパスを表します。 package. ;3 番目のパラメータは
go/doc.
Mode タイプで、クエリする情報を指定するために使用されます。
package main import ( "go/ast" "go/doc" "go/parser" "go/token" ) func main() { // 从本地源码文件解析 Go 代码 fset := token.NewFileSet() astFile, _ := parser.ParseFile(fset, "example.go", nil, parser.ParseComments) packageName := "example" pkg := &ast.Package{ Name: packageName, Files: map[string]*ast.File { "example.go": astFile, }, } // 创建一个 go/doc.Package 对象 targetPkg := doc.New(pkg, packageName, 0) }上記のコードは、
targetPkg という名前の
go/doc.Package オブジェクトを作成します。このオブジェクトには、
example パッケージのすべての情報が含まれています。以下では、このオブジェクトを使用してアノテーション情報を取得する方法を段階的に説明します。
go/doc.
Package タイプには、という名前の関数があります。
Funcs フィールドには、すべての関数とメソッドの注釈情報が含まれます。このフィールドは、キーとして関数名、値として
go/doc.
Func 型の値を持つマップです。
func Example() { targetPkg := ... // 获取函数的注释 f := targetPkg.Funcs["foo"] fmt.Println(f.Doc) // 输出函数 foo 的注释 }上記のコードでは、
targetPkg.Funcs["foo"] を通じて
foo 関数のアノテーション情報を取得し、それをコンソールに出力します。
go/doc.
Package タイプの
Types フィールドを使用できます。各
*go/doc.
Type オブジェクトには、メソッドを含む、それに関連するすべてのアノテーション情報が含まれています。
Name() メソッドを使用して型の名前を取得し、そのメソッド リストを走査して各メソッドの注釈情報を取得できます。
func Example() { targetPkg := ... // 获取结构体的注释和方法的注释 for _, t := range targetPkg.Types { fmt.Println(t.Doc) // 输出结构体的注释 for _, m := range t.Methods { fmt.Println(m.Doc) // 输出方法的注释 } } }上記のコードでは、
targetPkg.Types を使用して、すべての構造体とメソッドの注釈を取得します。
targetPkg.Types を走査し、型ごとに
t.Doc を使用してその注釈情報を取得し、
t.Methods を走査してそれぞれの注釈を取得します。メソッド情報。
go/doc.
Package タイプには、という名前のファイルがあります。
Types フィールド。すべての構造およびインターフェイス情報が含まれます。このフィールドは、タイプ名をキーとして、タイプ
go/doc.
Type の値を値として持つマップです。
go/doc.
Type 型の
Doc フィールドを使用して、構造の注釈情報を取得できます。
func Example() { targetPkg := ... // 获取结构体的注释 typ := targetPkg.Types["MyStruct"] fmt.Println(typ.Doc) }上記のコードでは、
targetPkg.Types["MyStruct"] を通じて
MyStruct という名前の構造体のアノテーション情報を取得し、コンソールに出力します。
go/doc.Type# の ## を使用することもできます。 ## type #Doc` フィールドは、インターフェースのアノテーション情報を取得します。
func Example() { targetPkg := ... // 获取接口的注释 typ := targetPkg.Types["MyInterface"] fmt.Println(typ.Doc) }
上記のコードでは、
MyInterface という名前のインターフェイスのアノテーション情報を targetPkg.Types["MyInterface"] を通じて取得し、コントロール タワーに出力します。 。
4. コメントのネストとフィルタリング
ネストされたコメントの取得
Package タイプでは、コメント情報は他のタイプにネストされます。ノート。ネストされたコメントをループすることで見つけることができます。次のコード例は、アノテーション情報を走査してネストされたアノテーションを見つける方法を示しています。
func Example() { targetPkg := ... // 遍历注释来查找嵌套的注释 for _, f := range targetPkg.Funcs { ast.Inspect(f.Decl, func(node ast.Node) bool { switch n := node.(type) { case *ast.CommentGroup: for _, c := range n.List { if strings.Contains(c.Text, "TODO") { fmt.Println(c) } } } return true }) } }
上述代码中,我们使用 targetPkg.Funcs
获取所有函数和方法的注释。然后,我们使用 go/ast
.Inspect 函数将注释树作为根节点输入,并遍历树中的所有注释。如果找到了包含特定文本的注释,则将其打印到控制台。在上述示例中,我们打印了所有包含 TODO
的注释。
有时候我们只对包含特定文本的注释感兴趣。在这种情况下,我们可以使用正则表达式或其他过滤器来过滤注释。下面示例代码演示了如何使用正则表达式过滤注释。
func Example() { targetPkg := ... // 使用正则表达式过滤注释 pattern, _ := regexp.Compile(`@deprecated`) for _, f := range targetPkg.Funcs { if pattern.MatchString(f.Doc) { fmt.Printf("Function %s is deprecated: %s ", f.Name, f.Doc) } } }
上述代码中,我们创建了一个名为 pattern
的正则表达式。然后,我们遍历 targetPkg.Funcs
,并使用 pattern
过滤所有包含 @deprecated
的注释。对于匹配的注释,我们将其打印到控制台。
总结
在本文中,我们探讨了如何使用 go/doc
包获取 Golang 源代码中的注释。我们介绍了基本的使用方法,并讲解了如何获取函数和方法、结构体和接口的注释。此外,我们还讨论了如何遍历注释以查找嵌套的注释,以及如何使用正则表达式或其他过滤器来过滤注释。希望本文能够帮助你更好地理解 Golang 的注释机制,并在实践中发挥作用。
以上がgolangでコメントを取得するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。