Entschlüsselung variadischer Parameter in Wrapper-Funktionen
Variadische Funktionen in Go spielen eine entscheidende Rolle bei der Akzeptanz einer beliebigen Anzahl von Argumenten. Um diese Funktion effektiv nutzen zu können, ist es wichtig zu verstehen, wie diese Parameter gehandhabt werden.
Betrachten Sie das Beispiel einer fmt.Fprintf-Wrapper-Funktion:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Beim Aufrufen dieser Funktion mit Die(" foo") erscheint eine eher unerwartete Ausgabe: foo%!(EXTRA []interface {}=[]). Dieses verwirrende Suffix kann auf die Art und Weise zurückgeführt werden, wie variadische Parameter übergeben werden.
Variadische Funktionen empfangen Argumente konstruktionsbedingt als Teil ihres jeweiligen Typs. In diesem Fall akzeptiert die Die-Funktion ein []interface{}-Slice mit dem Namen args. Wenn dieses Argument jedoch anschließend an fmt.Sprintf übergeben wird, wird es als einzelne Entität vom Typ []interface{} und nicht als die beabsichtigten einzelnen Werte behandelt.
Um dies zu beheben, sollte die ...-Syntax lauten Wird wie folgt verwendet:
str := fmt.Sprintf(format, args...)
Mit diesem Ansatz wird sichergestellt, dass jeder Wert in args als separates Argument an fmt.Sprintf übergeben wird, wodurch das Verhalten beim Empfang in der Die-Funktion nachgeahmt wird. Diese entscheidende Unterscheidung steht im Einklang mit der Go-Sprachspezifikation und garantiert die erwartete Ausgabe.
Das obige ist der detaillierte Inhalt vonWarum erzeugt „fmt.Sprintf' eine unerwartete Ausgabe, wenn ein variadischer Parameter in einer Wrapper-Funktion verwendet wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!