Załóżmy, że mam strukturę z wbudowaną inną strukturą.Jak zainicjować skomponowaną strukturę w Go?
type Base struct {
ID string
}
type Child struct {
Base
a int
b int
}
Kiedy idę do zainicjowania Child
, nie mogę zainicjować bezpośrednio pole ID
.
// unknown field 'ID' in struct literal of type Child
child := Child{ ID: id, a: a, b: b }
Zamiast tego muszę zainicjować pole ID osobno.
child := Child{ a: 23, b: 42 }
child.ID = "foo"
To mogłoby naruszać hermetyzację. Użytkownik Child musi wiedzieć, że w polu ID jest coś innego. Jeśli później przeniesię publiczne pole do osadzonej struktury, może to spowodować przerwanie inicjowania.
mógłbym napisać NewFoo()
metody dla każdej struktury i mam nadzieję, że każdy używa, ale czy istnieje sposób używać struct dosłownego bezpiecznie z wbudowanymi elemencie, który nie ujawnia niektóre pola są osadzone? Czy stosuję tutaj niewłaściwy wzór?
Naprawdę czuję, że powinien istnieć problem z Githubem. Czuję się jak syntaktyczny cukier na getterach (wspomniany w odpowiedzi @ CeriseLimón poniżej) (https://stackoverflow.com/questions/44123399/how-do-i-initialize--composed-struct-in-go/44123416? noredirect = 1 # comment75266036_44123416)) _really_ powinno być również zastosowane do ustawiaczy. Sposób, w jaki jest teraz, nie tylko sprawia, że kod jest brzydki, ale wymaga, aby użytkownik klasy był daleko bliżej obeznany z dziedziczeniem/hierarchią klasy, aby móc z niej korzystać. – KOGI