通过导入器获取有关包的所有信息并反映?

Ala*_*air 3 go go-reflect

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

/sf/answers/2249945631/

这很好用。但是,我想采取的下一步是迭代这些类型中的每一个以获取,例如,NumMethod(). 我没有看到一个立即明显的方法 - 任何人都可以透露一些信息,或者我将不得不求助于 AST?

mko*_*iva 6

您可以使用Scope和 名称来查找Object您感兴趣的s。

对象描述命名语言实体,例如包、常量、类型、变量、函数(包括方法)或标签。所有对象都实现了 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())
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,如果你想更进一步,*types.Named实现Type接口,所以你可以查看它的底层类型,它也是types.TypeStructSlice等实现的。