Variadische Funktionen in Go akzeptieren eine variable Anzahl von Argumenten, die als Slice des angegebenen Typs gespeichert werden. Beim Aufrufen einer Variadic-Funktion ist es wichtig zu verstehen, wie Argumente übergeben werden.
Betrachten Sie den folgenden Code, der versucht, einen Wrapper um fmt.Fprintf zu erstellen mit Argumenten variabler Länge:
func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) }
Beim Aufruf von Die("foo") enthält die Ausgabe das Unerwartete "%%!(EXTRA []interface {}=[])".
Das Problem entsteht durch die direkte Übergabe des Args-Slice an fmt .Sprintf. Um Argumente einzeln korrekt zu übergeben, muss der Auslassungsoperator ... verwendet werden:
package main import ( "fmt" "os" ) func Die(format string, args ...interface{}) { str := fmt.Sprintf(format, args...) fmt.Fprintf(os.Stderr, "%v\n", str) os.Exit(1) } func main() { Die("foo") }
Durch die Verwendung von ... wird jedes Element des args-Slice als separates Argument an fmt.Sprintf übergeben, wodurch das aufgelöst wird Problem lösen und die erwartete Ausgabe erzeugen:
foo
Das obige ist der detaillierte Inhalt vonWarum druckt mein fmt.Fprintf-Wrapper eine unerwartete Ausgabe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!