我正在try 使用Go的parserast包阅读 struct 类型上的关联文档注释.在本例中,代码只是将自身用作源代码.

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
        })
    }
}

函数和字段的注释文档输出没有问题,但是由于某些原因,找不到‘FirstType文档’和‘Second类型文档’.我遗漏了什么?GO版本为1.1.2.

(要运行上述程序,请将其保存到main.go文件中,然后保存为go run main.go)

推荐答案

您需要使用go/doc软件包从ast中提取文档:

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)
        }
    }
}

Go相关问答推荐

Go Net/http路由

理解Golang并发:缓冲通道的意外行为

切换选项卡时,Goland IDE中的光标自动转移

使用ciph.AEAD.Seal()查看内存使用情况

Hugo错误:没有为此项目配置现有内容目录

一次打印用户输入的字符串n次

Go:为什么我不能比较 net.Addr

如何使用 go 读取 RDF xml 文件中的 XML 命名空间属性

AWS Lambda 中的 Websocket URL 超时达到错误

如何使用管理员权限启动 powershell 进程并重定向标准输入 (os.exec)

使用图像解码 JPEG 时 colored颜色 不正确.解码并写入 PDF?

当函数返回一个函数时,为什么 Go 泛型会失败?

为超时的单元测试创​​建 deadlineExceededError:true

go-libp2p - 从流中接收字节

go:embed 文件扩展名模式

如何将具有嵌入式 struct 的 struct 展平为 json

为什么时间很短.睡眠时间比基准测试中要求的(约 300 ns)长?

如何在golang中使用ozzo验证进行时间最大验证

从 map 返回空数组而不是空字符串数组

Golang 将类型 [N]byte 转换为 []byte