如何在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") }
Bubbles.. 5
我无法以100%的信心回答,但我认为这不可能在Go中完成,至少与描述完全相同.这个讨论相当陈旧,但我认为它描述了基本问题 - 只是导入一个包并不能保证包中的任何方法都存在.编译器实际上尝试从包中删除每个未使用的函数.因此,如果您在另一个包中有一组"Result*"方法,那么当您调用该程序时,这些方法实际上并不存在,除非它们已被使用.
另外,如果看一下运行时反射库,您会注意到缺少任何形式的包级别分析.
根据您的使用情况,您可能还有一些事情可以做.如果您只想静态分析代码,可以解析包并获取文件中的所有函数说明,如下所示:
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
.这不是一个可调用的函数; 它只是它的源代码的表示.
如果你想做任何事情,比如打电话给这些功能,我想你必须做一些更复杂的事情.收集这些函数后,您可以收集它们并输出一个单独的文件来调用它们中的每一个,然后运行生成的文件.
我无法以100%的信心回答,但我认为这不可能在Go中完成,至少与描述完全相同.这个讨论相当陈旧,但我认为它描述了基本问题 - 只是导入一个包并不能保证包中的任何方法都存在.编译器实际上尝试从包中删除每个未使用的函数.因此,如果您在另一个包中有一组"Result*"方法,那么当您调用该程序时,这些方法实际上并不存在,除非它们已被使用.
另外,如果看一下运行时反射库,您会注意到缺少任何形式的包级别分析.
根据您的使用情况,您可能还有一些事情可以做.如果您只想静态分析代码,可以解析包并获取文件中的所有函数说明,如下所示:
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
.这不是一个可调用的函数; 它只是它的源代码的表示.
如果你想做任何事情,比如打电话给这些功能,我想你必须做一些更复杂的事情.收集这些函数后,您可以收集它们并输出一个单独的文件来调用它们中的每一个,然后运行生成的文件.