如何在golang中获取func文档?

时间:2019-02-06 16:42:39

标签: go

如何在go代码中获取功能描述?

// My very nice description
func myFunc() { ... }

我想拥有My very nice description

直接获得函数的名称

runtime.FuncForPC(reflect.ValueOf(myFunc).Pointer()).Name()

该文档是否有类似内容?我可以解析原始的go文件。有快捷键吗?

3 个答案:

答案 0 :(得分:4)

使用go/doc包从源代码中提取文档。

答案 1 :(得分:0)

您可以使用godoc工具生成文档。

检查以下链接 https://blog.golang.org/godoc-documenting-go-code

它应该给出您想要的东西

答案 2 :(得分:0)

以防万一有人需要代码,我将其发布在这里。它可能仍然有些丑陋,但在我的情况下可以正常工作。您可以根据自己的需要进行调整。

package funcreader

import (
    "go/ast"
    "go/doc"
    "go/parser"
    "go/token"
    "path/filepath"
    "reflect"
    "runtime"
    "strings"
)

// Get the name and path of a func
func FuncPathAndName(f interface{}) string {
    return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name()
}

// Get the name of a func (with package path)
func FuncName(f interface{}) string {
    splitFuncName := strings.Split(FuncPathAndName(f), ".")
    return splitFuncName[len(splitFuncName)-1]
}

// Get description of a func
func FuncDescription(f interface{}) string {
    fileName, _ := runtime.FuncForPC(reflect.ValueOf(f).Pointer()).FileLine(0)
    funcName := FuncName(f)
    fset := token.NewFileSet()

    // Parse src
    parsedAst, err := parser.ParseFile(fset, fileName, nil, parser.ParseComments)
    if err != nil {
        log.Fatal(err)
        return ""
    }

    pkg := &ast.Package{
        Name:  "Any",
        Files: make(map[string]*ast.File),
    }
    pkg.Files[fileName] = parsedAst

    importPath, _ := filepath.Abs("/")
    myDoc := doc.New(pkg, importPath, doc.AllDecls)
    for _, theFunc := range myDoc.Funcs {
        if theFunc.Name == funcName {
            return theFunc.Doc
        }
    }
    return ""
}