2017-05-22 16 views
5

Giả sử tôi có cấu trúc với cấu trúc khác được nhúng trong đó.Làm cách nào để khởi tạo cấu trúc được soạn thảo trong Go?

type Base struct { 
    ID string 
} 

type Child struct { 
    Base 
    a int 
    b int 
} 

Khi tôi đi đến khởi Child, tôi không thể khởi tạo các lĩnh vực ID trực tiếp.

// unknown field 'ID' in struct literal of type Child 
child := Child{ ID: id, a: a, b: b } 

Thay vào đó, tôi phải khởi tạo trường ID riêng biệt.

child := Child{ a: 23, b: 42 } 
child.ID = "foo" 

Điều này dường như vi phạm đóng gói. Người dùng của Child phải biết có điều gì đó khác biệt về trường ID. Nếu sau này tôi chuyển trường công khai thành một cấu trúc được nhúng, điều đó có thể phá vỡ khởi tạo.

Tôi có thể viết phương pháp NewFoo() cho mọi cấu trúc và hy vọng mọi người sử dụng, nhưng có cách nào để sử dụng cấu trúc an toàn theo nghĩa đen với các cấu trúc nhúng không tiết lộ một số trường được nhúng không? Hoặc tôi có áp dụng mẫu sai ở đây không?

+0

Tôi thực sự cảm thấy có vấn đề về vấn đề này. Tôi cảm thấy như đường cú pháp trên getters (được đề cập trong câu trả lời của [@ ​​CeriseLimón bên dưới] (https://stackoverflow.com/questions/44123399/how-do-i-initialize-a-composed-struct-in-go/44123416? noredirect = 1 # comment75266036_44123416)) _really_ cũng nên được áp dụng cho những người định cư. Cách nó bây giờ không chỉ làm cho mã xấu xí, mà yêu cầu người dùng của một lớp phải xa thân mật với thừa kế/phân cấp của lớp đó để sử dụng nó. – KOGI

Trả lời

13

Sử dụng lồng literals hợp để khởi tạo một giá trị trong một biểu thức duy nhất:

child := Child{Base: Base{ID: id}, a: a, b: b} 

Nó không thể che giấu thực tế là một lĩnh vực được đề bạt từ một struct nhúng.

+1

Trong khi 'child.ID' ẩn' ID' được nhúng, bộ khởi tạo không? Thật là một sự giám sát kỳ lạ. Nếu tôi muốn đóng gói khởi tạo, tôi cần phải viết các hàm 'Mới' của riêng mình? – Schwern

+4

Quảng bá trường trên các trường nhúng là cú pháp đường. Tính năng này không cung cấp đóng gói. –

+0

Tại sao bạn nói nó không cung cấp đóng gói? – Schwern

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