Heim > Backend-Entwicklung > Golang > Warum druckt mein fmt.Fprintf-Wrapper eine unerwartete Ausgabe?

Warum druckt mein fmt.Fprintf-Wrapper eine unerwartete Ausgabe?

DDD
Freigeben: 2024-11-12 22:51:02
Original
419 Leute haben es durchsucht

Why Does My fmt.Fprintf Wrapper Print Unexpected Output?

Übergabe von Argumenten an variadische Funktionen

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.

Problem: Zusätzliche Ausgabe im fmt.Fprintf-Wrapper

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

Beim Aufruf von Die("foo") enthält die Ausgabe das Unerwartete "%%!(EXTRA []interface {}=[])".

Lösung: Verwenden von Auslassungspunkten ... zum Übergeben von Argumenten

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

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

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage