2012-09-08 11 views
20

Sto cercando di scrivere semplice involucro fmt.Fprintf che prende numero variabile di argomenti, ecco il codice:Go - parametri Funzione Variadica pass-through

func Die(format string, args ...interface{}) { 
    str := fmt.Sprintf(format, args) 
    fmt.Fprintf(os.Stderr, "%v\n", str) 
    os.Exit(1) 
} 

Ma quando sto chiamando:

Die("foo")

ottengo:

foo%!(EXTRA []interface {}=[])

Non riesco a capire perché sto ottenendo questo testo dopo il "pippo" & qual è il modo corretto per creare wrapper su fmt.Fprintf?

+3

BTW, la funzione Die reimplementa cosa [log.Fatal] (http://golang.org/pkg/log/#Fatal) e/o [log.Logger.Fatalf] (http: // golang. org/pkg/log/# Logger.Fatalf) sono pronti per. – zzzz

risposta

35

Le funzioni variabili ricevono gli argomenti come una porzione del tipo. In questo caso la tua funzione riceve un []interface{} chiamato args. Quando si passa questo argomento a fmt.Sprintf, lo si passa come un singolo argomento di tipo []interface{}. Quello che vuoi veramente è passare ogni valore in args come argomento separato (nello stesso modo in cui li hai ricevuti). Per fare ciò è necessario utilizzare la sintassi ....

str := fmt.Sprintf(format, args...) 

Questo si spiega anche nella specifica Go here.

Problemi correlati