Es gibt mehrere Antworten / Techniken auf die folgende Frage:
- Wie setze ich Standardwerte für Golang-Strukturen?
- So initialisieren Sie Strukturen in Golang
Ich habe ein paar Antworten, aber weitere Diskussionen sind erforderlich.
go
struct
initialization
default-value
Prateek
quelle
quelle
Antworten:
Eine mögliche Idee besteht darin, eine separate Konstruktorfunktion zu schreiben
quelle
NewSomething
und sogar die FelderText
undDefaultText
exportieren, aber den Strukturtyp nicht exportierensomething
.reflect.New()
z. B. über), kann nicht erwartet werden, dass er über Ihre speziell benannte Factory-Funktion Bescheid weiß. In diesem Fall und ohne die Sprache selbst zu ändern, würde meiner Meinung nach nur eine Schnittstelle (nach der die Bibliothek suchen könnte) ausreichen.Erzwingen Sie eine Methode, um die Struktur abzurufen (den Konstruktorweg).
Dies kann erreicht werden, indem der Typ selbst einfach nicht exportiert wird. Sie können die Funktion NewSomething und sogar die Felder Text und DefaultText exportieren, aber den Strukturtyp nicht exportieren
Eine andere Möglichkeit, es für Ihr eigenes Modul anzupassen, ist die Verwendung einer Konfigurationsstruktur zum Festlegen von Standardwerten (Option 5 im Link). Dies ist jedoch keine gute Möglichkeit.
quelle
Ein Problem mit Option 1 als Antwort von Victor Zamanian ist, dass Benutzer Ihres Pakets, wenn der Typ nicht exportiert wird, ihn nicht als Typ für Funktionsparameter usw. deklarieren können. Eine Möglichkeit, dies zu umgehen, besteht darin, eine Schnittstelle anstelle der zu exportieren Struktur zB
Damit können wir Funktionsparametertypen über die exportierte Kandidatenschnittstelle deklarieren. Der einzige Nachteil, den ich aus dieser Lösung ersehen kann, ist, dass alle unsere Methoden in der Schnittstellendefinition deklariert werden müssen, aber Sie könnten argumentieren, dass dies sowieso eine gute Praxis ist.
quelle
Votes unit32
sollte wahrscheinlich seinVotes uint32
Es gibt eine Möglichkeit, dies mit Tags zu tun, die mehrere Standardeinstellungen zulassen.
Angenommen, Sie haben die folgende Struktur mit 2 Standard-Tags default0 und default1 .
Jetzt ist es möglich, die Standardeinstellungen festzulegen.
Hier ist das komplette Programm auf einem Spielplatz .
Wenn Sie an einem komplexeren Beispiel interessiert sind, z. B. mit Slices und Maps, dann werfen Sie einen Blick auf creasty / defaultse
quelle
Von https://golang.org/doc/effective_go.html#composite_literals :
Manchmal ist der Nullwert nicht gut genug und ein initialisierender Konstruktor ist erforderlich, wie in diesem Beispiel aus dem Paket os abgeleitet.
quelle
quelle