go - 如何在 golang 中列出包的公共(public)方法

标签 go reflection

<分区>

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

ma​​in.go

package main

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

libs/method.go

package libs

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

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

最佳答案

我不能 100% 有把握地回答,但我认为这在 Go 中是不可能的,至少与描述的完全一样。 This discussion is rather old ,但它描述了基本问题 - 仅导入包并不能保证包中的任何方法实际上都存在。编译器实际上试图从包中删除每个未使用的函数。因此,如果您在另一个包中有一组“Result*”方法,那么当您调用该程序时,这些方法实际上不会存在,除非它们已被使用。

此外,如果看一下 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 的形式获取指定子包中的所有函数声明。 .这不是一个可调用的函数;它只是它的源代码的表示。

如果您想执行任何操作(例如调用这些函数),则必须执行更复杂的操作。收集这些函数后,您可以收集它们并输出调用每个函数的单独文件,然后运行生成的文件。

关于go - 如何在 golang 中列出包的公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41629293/

相关文章:

sql - 为什么它需要在我的列名周围加上引号?

google-app-engine - 超过 Golang AppEngine 内存缓存截止日期

C# - 从接口(interface)的 GetCustomAttribute 找不到自定义属性

reflection - Pharo:如何比较不同检查员的对象?

reflection - TypeScript - 传递一个类作为参数,以及反射

c# - 如何判断MemberInfo是否为内部

go - 尝试向已关闭的 channel 插入值时避免 panic

enums - 是否可以在不在 Golang 中创建 String() 的情况下获取 Enum 名称

function - 声明和定义中不同的函数参数类型

asp.net - 使用反射将连接字符串添加到 ConfigurationManager.ConnectionString 的危险