2014-06-09 19 views
5

Czy możemy wyświetlić listę wszystkich struktur w postaci nazwy lub interfejsu pod pakietem? odczuwalna:Jak mogę uzyskać wszystkie struct pod pakietem w Golang?

struct := list("fmt") 

oczekiwany wynik:

Formatter 
GoStringer 
Scanner 
State 
Stringer 
+3

możliwy duplikat [Jak uzyskać wszystkie zdefiniowane struct w golang? ] (http://stackoverflow.com/questions/20803758/how-to-get-all-defined-struct-in-golang) – LinearZoetrope

+1

Go nie zapewnia tego rodzaju refleksji. Nie można przyjmować założeń dotyczących nazw symboli i ogólnie rzeczy, których faktycznie nie używasz. – fuz

Odpowiedz

2

Najlepiej można zrobić jest analizować go sources (co you can clone: hg clone https://code.google.com/p/go/) i izolować ast.StructType.

To co 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; 

W tej samej idei, linter go/lint robi to samo in lint.go:

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

W ten sposób, ale wydaje się bardzo brudny i nieoficjalny. –

+0

@AnthonyTsang nie, linter używa oficjalnego sposobu wyświetlania struktur. To nie jest "brudne", jest to konsekwencja tego, jak język jest zrobiony, jak wyjaśniono w http://stackoverflow.com/a/22222911/6309. – VonC

+1

Może powinienem bardziej rozwinąć mój przypadek użycia. Jestem z PHP, który jest tak dynamiczny, że pozwala mi robić prawie wszystko. Więc zraniłem, gdybym mógł to zrobić w Golang. Chcę wyświetlić listę wszystkich struktur w pakiecie i zainicjować je i użyć ich. Mój przypadek użycia jest taki: "To, co wygląda na początku łatwe, skończy się debugowaniem i utrzymaniem koszmaru". Dlatego muszę zatrzymać się tutaj i zaprojektować ponownie. –

Powiązane problemy