2014-06-09 13 views
5

Chúng tôi có thể liệt kê tất cả các cấu trúc dưới dạng tên hoặc giao diện, trong một gói không? Giống như:Làm thế nào tôi có thể nhận được tất cả các cấu trúc theo một gói trong Golang?

struct := list("fmt") 

kết quả mong đợi:

Formatter 
GoStringer 
Scanner 
State 
Stringer 
+3

thể trùng lặp của [Làm thế nào để có được tất cả struct quy định tại golang? ] (http://stackoverflow.com/questions/20803758/how-to-get-all-defined-struct-in-golang) – LinearZoetrope

+1

Đi không cung cấp loại phản xạ này. Bạn không thể đưa ra giả định về tên biểu tượng và thông thường mà bạn không thực sự sử dụng. – fuz

Trả lời

2

Điều tốt nhất bạn có thể làm là phân tích go sources (mà you can clone: hg clone https://code.google.com/p/go/), và cô lập các ast.StructType.

Đó là những gì một 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; 

Trong ý tưởng đó, linter go/lint cũng làm như vậy in lint.go:

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

Giống như cách này, nhưng có vẻ thực sự bẩn và không chính thức. –

+0

@AnthonyTsang no, linter sử dụng cách chính thức để liệt kê cấu trúc. Đây không phải là "bẩn", đây là hậu quả của cách ngôn ngữ được thực hiện, như được giải thích trong http://stackoverflow.com/a/22222911/6309. – VonC

+1

có lẽ tôi nên mở rộng thêm trường hợp sử dụng của mình. Tôi đến từ PHP vốn rất năng động, cho phép tôi làm hầu hết mọi thứ. Vì vậy, tôi đã bị thương nếu tôi có thể làm điều đó ở Golang. Tôi muốn liệt kê tất cả các cấu trúc theo một gói và khởi tạo chúng và sử dụng chúng. Trường hợp sử dụng của tôi chính xác là "Những gì trông dễ dàng lúc đầu sẽ kết thúc trong gỡ lỗi và bảo trì cơn ác mộng". Vì vậy, tôi cần phải dừng lại ở đây và thiết kế một lần nữa. –

Các vấn đề liên quan