如何在Golang中获取包下的所有结构?

Ant*_*ang 7 go

我们可以在包下面以名称或接口的形式列出所有结构吗?喜欢:

struct := list("fmt")
Run Code Online (Sandbox Code Playgroud)

预期结果:

Formatter
GoStringer
Scanner
State
Stringer
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 3

你能做的最好的事情就是解析go 源代码你可以克隆它:)hg clone https://code.google.com/p/go/,并隔离ast.StructType.

这就是漂亮打印机的作用

func (P *Printer) Type(t *AST.Type) int {
    separator := semicolon;

    switch t.form {

    case AST.STRUCT, AST.INTERFACE:
            switch t.form {
            case AST.STRUCT: P.String(t.pos, "struct");
            case AST.INTERFACE: P.String(t.pos, "interface");
            }
            if t.list != nil {
                    P.separator = blank;
                    P.Fields(t.list, t.end);
            }
            separator = none;
Run Code Online (Sandbox Code Playgroud)

同样的想法,linter go/lint在 lint.go 中做同样的事情:

    case *ast.StructType:
        for _, f := range v.Fields.List {
            for _, id := range f.Names {
                check(id, "struct field")
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • @AnthonyTsang 不,linter 使用官方方式列出结构。这不是“脏”,这是语言完成方式的结果,如 http://stackoverflow.com/a/22222911/6309 中所述。 (2认同)
  • 也许我应该扩展更多我的用例。我来自 PHP,它非常动态,几乎可以让我做任何事情。所以如果我能在 Golang 中做到这一点,我会很受伤。我想列出包下的所有结构并初始化它们并使用它们。我的用例正是“一开始看起来很容易的事情最终会变成调试和维护噩梦”。因此,我需要在这里停下来重新设计。 (2认同)