【问题标题】:Get all info about a package via importer and reflect?通过导入器获取有关包的所有信息并反映?
【发布时间】:2017-11-03 15:10:18
【问题描述】:

我偶然发现了一个关于如何获取包中所有类型的问题的答案:

https://stackoverflow.com/a/32142080/470339

效果很好。但是,我想采取的下一步是遍历这些类型中的每一个以获得例如NumMethod()。我没有看到立即明显的方法来做到这一点 - 任何人都可以解释一下,还是我不得不求助于弄乱 AST?

【问题讨论】:

    标签: go go-reflect


    【解决方案1】:

    您可以使用Scope 和您感兴趣的Lookup 的名称。

    一个对象描述了一个命名的语言实体,例如一个包, 常量、类型、变量、函数(包括方法)或标签。全部 对象实现 Object 接口。

    有一个Named 类型实现了Object 接口,并且有一个名为NumMethods 的方法。

    package main
    
    import (
        "fmt"
        "go/importer"
        "go/types"
    )
    
    func main() {
        pkg, err := importer.Default().Import("time")
        if err != nil {
            fmt.Printf("error: %s\n", err.Error())
            return
        }
    
        scope := pkg.Scope()
        for _, name := range scope.Names() {
            if name == "Time" {
                obj := scope.Lookup(name)
                if tn, ok := obj.Type().(*types.Named); ok {
                    fmt.Printf("%#v\n", tn.NumMethods())
                }
            }
        }
    }
    

    那么,如果你想更进一步,*types.Named实现了Type接口,那么你可以看看它的底层类型,它也是types.Type实现的StructSlice等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2013-07-18
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多