如何在go代码中获取功能描述?
// My very nice description
func myFunc() { ... }
我想拥有My very nice description
。
直接获得函数的名称
runtime.FuncForPC(reflect.ValueOf(myFunc).Pointer()).Name()
该文档是否有类似内容?我可以解析原始的go文件。有快捷键吗?
答案 0 :(得分:4)
使用go/doc包从源代码中提取文档。
答案 1 :(得分:0)
答案 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 ""
}