Warum erzeugt „fmt.Sprintf' eine unerwartete Ausgabe, wenn ein variadischer Parameter in einer Wrapper-Funktion verwendet wird?

Patricia Arquette
Freigeben: 2024-11-16 07:59:03
Original
934 Leute haben es durchsucht

Why does `fmt.Sprintf` produce unexpected output when using a variadic parameter in a wrapper function?

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)
}
Nach dem Login kopieren

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...)
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage