通过进口商获取有关包裹的所有信息并反映出来?

时间:2017-11-03 04:36:11

标签: go go-reflect

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

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

哪个效果很好。但是,我想要采取的下一步是迭代这些类型中的每一个,例如,NumMethod()。我没有看到一个明显的方法这样做 - 任何人都可以解决一些问题,还是我不得不诉诸于使用AST?

1 个答案:

答案 0 :(得分:3)

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

  

对象描述命名语言实体,例如包,   常量,类型,变量,函数(包括方法)或标签。所有   对象实现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接口,那么你可以查看它的基础类型,它也是由Struct实现的types.TypeSlice