Kann Go optionale Parameter haben? Oder kann ich einfach zwei Funktionen mit demselben Namen und einer unterschiedlichen Anzahl von Argumenten definieren?
go
overloading
Devyn
quelle
quelle
Antworten:
Go verfügt weder über optionale Parameter noch unterstützt es das Überladen von Methoden :
quelle
make
ein Sonderfall? Oder ist es nicht einmal wirklich als Funktion implementiert ...make
ist ein Sprachkonstrukt und die oben genannten Regeln gelten nicht. Siehe diese verwandte Frage .range
ist der gleiche Fall wiemake
in diesem SinneEin guter Weg, um so etwas wie optionale Parameter zu erreichen, ist die Verwendung verschiedener Argumente. Die Funktion empfängt tatsächlich ein Slice des von Ihnen angegebenen Typs.
quelle
params
ist ein Stück IntsSie können eine Struktur verwenden, die die folgenden Parameter enthält:
quelle
Für eine beliebige, möglicherweise große Anzahl optionaler Parameter ist es eine gute Redewendung, funktionale Optionen zu verwenden .
Foobar
Schreiben Sie für Ihren Typ zunächst nur einen Konstruktor:Dabei ist jede Option eine Funktion, die die Foobar mutiert. Bieten Sie Ihrem Benutzer dann bequeme Möglichkeiten, Standardoptionen zu verwenden oder zu erstellen, zum Beispiel:
Spielplatz
Aus Gründen der Übersichtlichkeit können Sie dem Typ der Optionen ( Spielplatz ) einen Namen geben :
Wenn Sie obligatorische Parameter benötigen, fügen Sie diese als erste Argumente des Konstruktors vor der Variadik hinzu
options
.Die Hauptvorteile der Funktionsoptionssprache sind:
Diese Technik wurde von Rob Pike geprägt und auch von Dave Cheney demonstriert .
quelle
func()
s sein könnten , als dass dies mein Gehirn um diesen Ansatz biegt. Immer wenn ich diesen Ansatz verwenden muss, beispielsweise bei der Echo-Bibliothek, gerät mein Gehirn in das Kaninchenloch der Abstraktionen. #fwiwIn Go werden weder optionale Parameter noch Funktionsüberladung unterstützt. Go unterstützt eine variable Anzahl von Parametern: Übergeben von Argumenten an ... Parameter
quelle
Nein auch nicht. Gemäß den Dokumenten für Go for C ++ - Programmierer ,
Ich kann keine ebenso klare Aussage finden, dass optionale Parameter nicht unterstützt werden, aber sie werden auch nicht unterstützt.
quelle
Sie können dies ganz gut in einer Funktion zusammenfassen, die der folgenden ähnelt.
In diesem Beispiel enthält die Eingabeaufforderung standardmäßig einen Doppelpunkt und ein Leerzeichen. . .
. . . Sie können dies jedoch überschreiben, indem Sie der Eingabeaufforderungsfunktion einen Parameter zuweisen.
Dies führt zu einer Eingabeaufforderung wie unten.
quelle
Am Ende habe ich eine Kombination aus einer Struktur von Parametern und verschiedenen Argumenten verwendet. Auf diese Weise musste ich die vorhandene Schnittstelle, die von mehreren Diensten verwendet wurde, nicht ändern, und mein Dienst konnte bei Bedarf zusätzliche Parameter übergeben. Beispielcode auf dem Golang-Spielplatz: https://play.golang.org/p/G668FA97Nu
quelle
Die Sprache Go unterstützt keine Methodenüberladung, aber Sie können verschiedene Argumente wie optionale Parameter verwenden. Sie können auch die Schnittstelle {} als Parameter verwenden, dies ist jedoch keine gute Wahl.
quelle
Ich bin etwas spät dran, aber wenn Sie eine flüssige Benutzeroberfläche mögen, können Sie Ihre Setter für verkettete Anrufe wie folgt entwerfen:
Und dann nenne es so:
Dies ähnelt der in der Antwort von @Ripounet dargestellten Redewendung für funktionale Optionen und bietet dieselben Vorteile, weist jedoch einige Nachteile auf:
err
Variable zu deklarieren und auf Null zu setzen.Es gibt jedoch einen möglichen kleinen Vorteil: Diese Art von Funktionsaufrufen sollte für den Compiler einfacher zu inline sein, aber ich bin wirklich kein Spezialist.
quelle
Sie können beliebige benannte Parameter mit einer Karte übergeben.
quelle
Eine andere Möglichkeit wäre, eine Struktur zu verwenden, die mit einem Feld angibt, ob sie gültig ist. Die Nulltypen von SQL wie NullString sind praktisch. Es ist schön, keinen eigenen Typ definieren zu müssen, aber falls Sie einen benutzerdefinierten Datentyp benötigen, können Sie immer dem gleichen Muster folgen. Ich denke, die Optionalität ergibt sich aus der Funktionsdefinition und es gibt nur minimalen zusätzlichen Code oder Aufwand.
Als Beispiel:
quelle