Istnieje wiele odpowiedzi / technik na poniższe pytanie:
- Jak ustawić domyślne wartości struktur golang?
- Jak zainicjować struktury w golang
Mam kilka odpowiedzi, ale wymagana jest dalsza dyskusja.
go
struct
initialization
default-value
Prateek
źródło
źródło
Odpowiedzi:
Jednym z możliwych pomysłów jest napisanie oddzielnej funkcji konstruktora
źródło
NewSomething
a nawet polaText
iDefaultText
, ale po prostu nie eksportuj typu strukturysomething
.reflect.New()
na przykład przez), nie można oczekiwać, że dowie się o twojej specjalnie nazwanej funkcji fabryki. W takim przypadku, poza zmianą samego języka, wystarczyłby tylko interfejs (który biblioteka mogłaby sprawdzić).Wymuś metodę, aby uzyskać strukturę (sposób konstruktora).
Można to zrobić, po prostu wyłączając sam typ. Możesz wyeksportować funkcję NewSomething a nawet pola Text i DefaultText, ale po prostu nie eksportuj struktury wpisz coś
Innym sposobem dostosowania go do własnego modułu jest użycie struktury Config do ustawienia wartości domyślnych (opcja 5 w linku). Nie jest to jednak dobry sposób.
źródło
Jednym z problemów z opcją 1 w odpowiedzi Victora Zamaniana jest to, że jeśli typ nie jest eksportowany, użytkownicy twojego pakietu nie mogą zadeklarować go jako typ parametrów funkcji itp. Jednym ze sposobów obejścia tego byłoby wyeksportowanie interfejsu zamiast struktura np
Dzięki temu możemy zadeklarować typy parametrów funkcji za pomocą wyeksportowanego interfejsu Kandydata. Jedyną wadą, jaką widzę w tym rozwiązaniu, jest to, że wszystkie nasze metody muszą być zadeklarowane w definicji interfejsu, ale można by argumentować, że i tak jest to dobra praktyka.
źródło
Votes unit32
prawdopodobnie powinno byćVotes uint32
Można to zrobić za pomocą tagów, które pozwalają na wiele wartości domyślnych.
Załóżmy, że masz następującą strukturę z 2 domyślnymi tagami default0 i default1 .
Teraz można ustawić wartości domyślne.
Oto pełny program na placu zabaw .
Jeśli interesuje Cię bardziej złożony przykład, powiedzmy z plasterkami i mapami, spójrz na creasty / defaultse
źródło
Z https://golang.org/doc/effective_go.html#composite_literals :
Czasami wartość zero nie jest wystarczająco dobra i potrzebny jest konstruktor inicjujący, jak w tym przykładzie pochodzącym z pakietu os.
źródło
źródło