2014-11-11 37 views
26

Làm cách nào để bạn khởi tạo cấu trúc sau?Khởi tạo định nghĩa cấu trúc lồng nhau trong Golang

type Sender struct { 
    BankCode string 
    Name  string 
    Contact struct { 
     Name string 
     Phone string 
    } 
} 

tôi đã cố gắng:

s := &Sender{ 
     BankCode: "BC", 
     Name:  "NAME", 
     Contact { 
      Name: "NAME", 
      Phone: "PHONE", 
     }, 
    } 

Không làm việc:

mixture of field:value and value initializers 
undefined: Contact 

tôi đã cố gắng:

s := &Sender{ 
     BankCode: "BC", 
     Name:  "NAME", 
     Contact: Contact { 
      Name: "NAME", 
      Phone: "PHONE", 
     }, 
    } 

Không làm việc:

undefined: Contact 

Trả lời

36

Contact của bạn là trường có loại cấu trúc ẩn danh. Do đó, bạn phải lặp lại định nghĩa loại:

s := &Sender{ 
    BankCode: "BC", 
    Name:  "NAME", 
    Contact: struct { 
     Name string 
     Phone string 
    }{ 
     Name: "NAME", 
     Phone: "PHONE", 
    }, 
} 

Nhưng trong hầu hết các trường hợp, tốt hơn nên xác định loại riêng biệt như rob74 được đề xuất.

+2

Ok, đó có vẻ là câu trả lời đúng, nhưng như bạn nói câu trả lời của rob74 là thanh lịch hơn. – Kiril

24

Làm thế nào về việc xác định hai cấu trúc riêng biệt và sau đó nhúng "Liên hệ" trong "Tên người gửi"?

type Sender struct { 
    BankCode string 
    Name  string 
    Contact 
} 

type Contact struct { 
    Name string 
    Phone string 
} 

nếu bạn làm theo cách này, nỗ lực khởi tạo thứ hai của bạn sẽ hoạt động. Ngoài ra, bạn có thể sử dụng "Liên hệ" một mình.

Nếu bạn thực sự muốn sử dụng cấu trúc lồng nhau, bạn có thể sử dụng câu trả lời của Ainar-G, nhưng phiên bản này không đẹp (và thậm chí còn xấu hơn nếu cấu trúc được lồng sâu, như được hiển thị here), vì vậy tôi sẽ không làm điều đó nếu nó có thể tránh được.

+0

Đây là một tùy chọn khác, nhưng tôi chỉ muốn biết cách khởi tạo cấu trúc lồng nhau. – Kiril

+1

Câu trả lời của bạn là cách tốt hơn để giải quyết định nghĩa cấu trúc lồng nhau, nhưng câu trả lời của Ainar-G là câu trả lời đúng cho câu hỏi của tôi. – Kiril

1
type NameType struct { 
    First string 
    Last string 
} 
type UserType struct { 
    NameType 
    Username string 
} 

user := UserType{NameType{"Eduardo", "Nunes"}, "esnunes"} 

// or 

user := UserType{ 
    NameType: NameType{ 
     First: "Eduardo", 
     Last: "Nunes", 
    }, 
    Username: "esnunes", 
} 
Các vấn đề liên quan