2014-06-09 3 views
5

Можем ли мы перечислить всю структуру в виде имени или интерфейса под пакетом? как:Как я могу получить всю структуру под пакетом в Голанге?

struct := list("fmt") 

ожидаемый результат:

Formatter 
GoStringer 
Scanner 
State 
Stringer 
+3

возможный дубликат [Как получить все определенные структуры в golang? ] (http://stackoverflow.com/questions/20803758/how-to-get-all-defined-struct-in-golang) – LinearZoetrope

+1

Go не обеспечивает такого рода отражение. Вы не можете делать предположения о именах символов и вообще тех вещей, которые вы фактически не используете. – fuz

ответ

2

Лучшее, что вы можете сделать, это разобрать 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") 
      } 
     } 
    } 
+0

Нравится этот путь, но кажется действительно грязным и неофициальным. –

+0

@ AnthonyTsang no, linter использует официальный способ отображения структур. Это не «грязно», это следствие того, как этот язык выполняется, как описано в http://stackoverflow.com/a/22222911/6309. – VonC

+1

Возможно, я должен расширить свой вариант использования. Я из PHP, который настолько динамичен, что позволяет мне делать почти все. Поэтому я был ранен, если смог сделать это в Голанге. Я хочу перечислить все структуры под пакетом и запустить их и использовать. Мой пример использования - «То, что легко выглядит в начале, закончится в кошмаре отладки и обслуживания». Поэтому мне нужно остановиться здесь и снова задуматься. –

Смежные вопросы