2017-05-22 21 views
5

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?

+0

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

Odpowiedz

13

Użyj zagnieżdżone literały kompozytowe zainicjować wartości w jednym wyrażeniu:

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

To nie jest możliwe, aby ukryć fakt, że pole jest promowana z osadzonym struktury.

+1

Podczas gdy 'child.ID' ukrywa, że' ID' jest osadzone, inicjator nie ma? Co za dziwne niedopatrzenie. Jeśli potrzebuję hermetyzacji inicjalizacyjnej, muszę napisać własne funkcje "nowe"? – Schwern

+4

Promocja pól na polach osadzonych to cukier syntaktyczny. Ta funkcja nie zapewnia hermetyzacji. –

+0

Dlaczego mówisz, że nie zapewnia hermetyzacji? – Schwern