2012-09-08 24 views
20

Próbuję napisać prosty fmt.Fprintf owijkę, która trwa zmienną liczbę argumentów, oto kod:go - o zmiennej liczbie argumentów parametry funkcji pass-through

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

Ale kiedy dzwonię go:

Die("foo")

uzyskać:

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

Nie mogę zrozumieć, dlaczego otrzymuję ten tekst po "foo" & jaki jest prawidłowy sposób tworzenia wrapperów wokół fmt.Fprintf?

+3

BTW, funkcja Die ponownie realizuje to, co [log.Fatal] (http://golang.org/pkg/log/#Fatal) i/lub [log.Logger.Fatalf] (http: // golang. org/pkg/log/# Logger.Fatalf) są gotowe do wykonania. – zzzz

Odpowiedz

35

Funkcje varariadic przyjmują argumenty jako plaster tego typu. W takim przypadku twoja funkcja otrzymuje []interface{} o nazwie args. Po przekazaniu tego argumentu do fmt.Sprintf podajesz go jako pojedynczy argument typu []interface{}. To, czego naprawdę chcesz, to przekazanie każdej wartości w args jako osobnego argumentu (w ten sam sposób, w jaki je otrzymałeś). Aby to zrobić, musisz użyć składni .... To jest również wyjaśnione w specyfikacji Go here.

Powiązane problemy