如何在golang中列出包的公共方法

时间:2017-01-13 07:18:45

标签: go reflection

如何在golang中列出包的公共方法?

main.go

package main

func main() {
// list all public methods in here
}

库/ method.go

package libs

func Resut1() {
    fmt.Println("method Result1")
}

func Resut2() {
    fmt.Println("method Result2")
}

2 个答案:

答案 0 :(得分:5)

我无法100%自信地回答,但我不认为这可以在Go中完成,至少与描述完全相同。 This discussion is rather old,但我认为它描述了基本问题 - 只是导入包并不能保证包中的任何方法都存在。编译器实际上尝试从包中删除每个未使用的函数。所以如果你有一套"结果*"在另一个包中的方法,当你调用程序时,这些方法实际上不存在,除非它们已被使用。

此外,如果查看runtime reflection library,您会注意到缺少任何形式的包级别分析。

根据您的使用情况,您可能还可以做一些事情。如果您只想静态分析代码,可以解析一个包并在文件中获取所有函数说明,如下所示:

import (
    "fmt"
    "go/ast"
    "go/parser"
    "go/token"
    "os"
)

const subPackage := "sub"

func main() {
    set := token.NewFileSet()
    packs, err := parser.ParseDir(set, subPackage, nil, 0)
    if err != nil {
        fmt.Println("Failed to parse package:", err)
        os.Exit(1)
    }

    funcs := []*ast.FuncDecl{}
    for _, pack := range packs {
        for _, f := range pack.Files {
            for _, d := range f.Decls {
                if fn, isFn := d.(*ast.FuncDecl); isFn {
                    funcs = append(funcs, fn)
                }
            }
        }
    }

    fmt.Printf("all funcs: %+v\n", funcs)
}

这将使所述子包中的所有函数停留为ast.FuncDecl。这不是一个可调用的函数;它只是它的源代码的表示。

如果您想做一些事情,比如打电话给这些功能,我认为您必须做一些更复杂的事情。收集这些函数后,您可以收集它们并输出一个单独的文件来调用它们中的每一个,然后运行生成的文件。

答案 1 :(得分:-1)

如果您正在讨论使用命令行解决这个问题,请使用JAVA_HOME命令。特别是,从运行开始

go list

在您的终端。

如果你的意思是在运行时在自己的Go代码中执行此操作,我相信这在标准包go help list 的帮助下是可行的。