2014-10-02 20 views
17

Tôi là người mới trong Go. Vấn đề này đang khiến tôi phát điên. Làm thế nào để bạn init mảng structs trong Go?Init mảng các cấu trúc trong Go

type opt struct { 
    shortnm  char 
    longnm, help string 
    needArg  bool 
} 

const basename_opts []opt { 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a"} 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b"} 
    } 

Trình biên dịch cho biết nó mong đợi ';' sau khi chọn [].

Tôi nên đặt dấu ngoặc nhọn '{' để bắt đầu mảng cấu trúc của mình ở đâu?

Cảm ơn bạn

Trả lời

30

Dường như bạn đang cố gắng sử dụng (gần như) thẳng mã C tại đây. Go có một vài khác biệt.

  • Trước hết, bạn không thể khởi tạo mảng và lát thành const. Thuật ngữ const có ý nghĩa khác trong Go, giống như trong C. Danh sách nên được định nghĩa là var thay thế.
  • Thứ hai, dưới dạng quy tắc kiểu, Go thích basenameOpts như trái ngược với basename_opts.
  • Không có char nhập bằng Go. Bạn có thể muốn byte (hoặc rune nếu bạn có ý định cho phép các điểm mã unicode).
  • Việc khai báo danh sách phải có toán tử gán trong trường hợp này. Ví dụ: var x = foo.
  • Trình phân tích cú pháp của Go yêu cầu mỗi phần tử trong khai báo danh sách kết thúc bằng dấu phẩy. Điều này bao gồm phần tử cuối cùng. Lý do là vì Go tự động chèn dấu chấm phẩy khi cần. Và điều này đòi hỏi cú pháp hơi chặt chẽ hơn để làm việc.

Ví dụ:

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts = []opt { 
    opt { 
     shortnm: 'a', 
     longnm: "multiple", 
     needArg: false, 
     help: "Usage for a", 
    }, 
    opt { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

Một cách khác là để khai báo danh sách với loại của nó và sau đó sử dụng một chức năng init để lấp đầy nó lên. Điều này chủ yếu hữu ích nếu bạn dự định sử dụng các giá trị được trả về bởi các hàm trong cấu trúc dữ liệu. init chức năng được chạy khi chương trình đang được khởi tạo và được đảm bảo hoàn thành trước khi main được thực hiện. Bạn có thể có nhiều chức năng init trong một gói hoặc thậm chí trong cùng một tệp nguồn.

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts []opt 

func init() { 
    basenameOpts = []opt{ 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a", 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b", 
     }, 
    ) 
} 

Vì bạn mới sử dụng, tôi khuyên bạn nên đọc qua the language specification. Nó khá ngắn và được viết rất rõ ràng. Nó sẽ xóa rất nhiều những idiosyncrasies nhỏ cho bạn.

18

Thêm này cũng giống như một sự bổ sung để @ jimt là câu trả lời tuyệt vời:

một cách phổ biến để định nghĩa nó tất cả cùng thời gian khởi tạo được sử dụng một cấu trúc vô danh:

var opts = []struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
}{ 
    {'a', "multiple", "Usage for a", false}, 
    { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

này thường được sử dụng để thử nghiệm như cũng để xác định vài trường hợp thử nghiệm và lặp qua chúng.

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