Ich habe das Gefühl, dass ich viel zu spät zu dieser Party komme, aber ich war auf der Suche, um zu sehen, ob es einen besseren Weg gibt, dies zu tun als das, was ich bereits tue. Diese Art löst, was Sie versuchen zu tun, während auch das Konzept der ein optionales Argument geben.
package main
import "fmt"
type FooOpts struct {
// optional arguments
Value string
}
func NewFoo(mandatory string) {
NewFooWithOpts(mandatory, &FooOpts{})
}
func NewFooWithOpts(mandatory string, opts *FooOpts) {
if (&opts) != nil {
fmt.Println("Hello " + opts.Value)
} else {
fmt.Println("Hello")
}
}
func main() {
NewFoo("make it work please")
NewFooWithOpts("Make it work please", &FooOpts{Value: " World"})
}
Aktualisierung 1:
Ein funktionales Beispiel hinzugefügt, um die Funktionalität im Vergleich zum Beispiel zu zeigen
1 Stimmen
In diesem Zusammenhang: So kann man obligatorische Parameter erzwingen, wenn man variadic als optionale Parameter verwendet: Ist es möglich, Kompilierzeit Fehler mit benutzerdefinierten Bibliothek in Golang auslösen?
110 Stimmen
Google hat eine schreckliche Entscheidung getroffen, denn manchmal hat eine Funktion einen 90%igen Anwendungsfall und dann einen 10%igen Anwendungsfall. Das optionale Argument ist für diese 10 % des Anwendungsfalls gedacht. Vernünftige Standardwerte bedeuten weniger Code, weniger Code bedeutet mehr Wartbarkeit.
7 Stimmen
Ich halte den Verzicht auf optionale Parameter für eine gute Entscheidung. Ich habe gesehen, dass optionale Parameter in C++ ziemlich stark missbraucht wurden - 40+ Argumente. Es ist sehr fehleranfällig, die Argumente durchzuzählen und sicherzustellen, dass man das richtige angibt, besonders ohne benannte Parameter. Viel besser ist es, eine Struktur zu verwenden, wie von @deamon erwähnt.
5 Stimmen
@Jonathan es gibt mehrere Möglichkeiten, damit umzugehen. Eine Möglichkeit ist, eine Struktur mit allen Parametern für die Funktion zu übergeben. Dies hat den zusätzlichen Vorteil, dass man benannte Parameter hat (klarer als Positionsparameter) und alle Parameter, die nicht übergeben werden, ihren Standardwert haben. Und natürlich kann man auch einfach eine Wrapper-Funktion erstellen, die den Standardwert an die vollständige Funktion übergibt. z.B. Query und QueryWithContext
3 Stimmen
@Falco moderne IDEs generieren automatisch benannte Parameter aus der Semantik, so dass es nicht ideal erscheint, den Programmierer zu zwingen, seinen Code umzugestalten, um etwas zu tun, was eine IDE für Sie tun kann
0 Stimmen
@Jonathan Die meisten IDEs zeigen beim beiläufigen Lesen von Code keine Parameternamen an. Normalerweise muss man den Funktionsaufruf auswählen, um die Signatur zu sehen, und dann die tatsächlichen Parameter der Liste der Parameternamen im Kopf zuordnen. Die meisten Codestile / Clean Code Papers raten auch von langen Parameterlisten in Funktionen ab. Man sollte entweder eine Struktur übergeben oder ein objektorientiertes Design verwenden, wenn man eine Funktion mit vielen Parametern hat.
1 Stimmen
@Falco Ich habe ausdrücklich erklärt modern IDEs. Die meisten Legacy-IDEs haben das von Ihnen erwähnte Verhalten.
2 Stimmen
@Jonathan es scheint nicht zu funktionieren out of the box in VS Code, Visual Studio, IntelliJ, Atom oder Sublime. Auf welche IDE beziehen Sie sich, oder gibt es Erweiterungen/Einstellungen, die dies ermöglichen?