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

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

DDD
DDDOriginal
2024-11-12 22:51:02349Durchsuche

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)
}

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")
}

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!

Stellungnahme:
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