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?
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