Go 解析器未检测到结构体类型的文档注释
在 Go 中,识别结构体类型关联的文档注释可以通过解析器和 ast 包。以下是对为什么可能检测不到这些注释的调查:
问题
问题中提供的源代码演示了尝试使用以下方法检索结构类型的文档注释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中文网其他相关文章!