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

8

我们能否以名称或接口的形式,列出一个包中所有的结构体? 例如:

struct := list("fmt")

期望结果:

Formatter
GoStringer
Scanner
State
Stringer

3
可能是重复的问题:如何在golang中获取所有定义的结构体? - Linear
1
Go语言不提供这种反射。您不能对符号名称和通常不实际使用的内容进行假设。 - fuz
1个回答

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;

在同样的思路下,linter go/lint 做了与 lint.go 相同的事情:

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

就像这样,但看起来非常不规范和非官方。 - Anthony Tsang
2
@AnthonyTsang 不,linter使用官方的方式列出结构。这不是“肮脏”的,这是语言实现的后果,如https://dev59.com/fnrZa4cB1Zd3GeqP5a6l#22222911中所解释的那样。 - VonC
2
也许我应该更加扩展我的用例。我来自于 PHP,它非常动态,几乎可以做任何事情。所以我想知道我是否可以在 Golang 中实现它。我想要列出包中的所有结构体并对其进行初始化和使用。我的用例确切地是“开始看起来很容易,最终会变成调试和维护的噩梦”。因此,我需要停下来重新设计。 - Anthony Tsang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接