Можем ли мы перечислить всю структуру в виде имени или интерфейса под пакетом? как:Как я могу получить всю структуру под пакетом в Голанге?
struct := list("fmt")
ожидаемый результат:
Formatter
GoStringer
Scanner
State
Stringer
Можем ли мы перечислить всю структуру в виде имени или интерфейса под пакетом? как:Как я могу получить всю структуру под пакетом в Голанге?
struct := list("fmt")
ожидаемый результат:
Formatter
GoStringer
Scanner
State
Stringer
Лучшее, что вы можете сделать, это разобрать go sources (который you can clone: hg clone https://code.google.com/p/go/
) и изолировать ast.StructType
.
Это то, что pretty printer does:
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 делает то же in lint.go:
case *ast.StructType:
for _, f := range v.Fields.List {
for _, id := range f.Names {
check(id, "struct field")
}
}
}
Нравится этот путь, но кажется действительно грязным и неофициальным. –
@ AnthonyTsang no, linter использует официальный способ отображения структур. Это не «грязно», это следствие того, как этот язык выполняется, как описано в http://stackoverflow.com/a/22222911/6309. – VonC
Возможно, я должен расширить свой вариант использования. Я из PHP, который настолько динамичен, что позволяет мне делать почти все. Поэтому я был ранен, если смог сделать это в Голанге. Я хочу перечислить все структуры под пакетом и запустить их и использовать. Мой пример использования - «То, что легко выглядит в начале, закончится в кошмаре отладки и обслуживания». Поэтому мне нужно остановиться здесь и снова задуматься. –
возможный дубликат [Как получить все определенные структуры в golang? ] (http://stackoverflow.com/questions/20803758/how-to-get-all-defined-struct-in-golang) – LinearZoetrope
Go не обеспечивает такого рода отражение. Вы не можете делать предположения о именах символов и вообще тех вещей, которые вы фактически не используете. – fuz