Protokollieren Sie mehrere zurückgegebene Werte in Go
-
21-12-2019 - |
Frage
Gibt es eine idiomatische Möglichkeit, das Ergebnis einer Funktion zu protokollieren, die mehrere Werte zurückgibt?Das lässt sich nicht kompilieren:
import "log"
func returnPair() (int,int) {
return 42, 24
}
func main() {
log.Printf("Returned %v", returnPair())
}
prog.go:7: multiple-value returnPair() in single-value context
UPD-Zusammenfassung (besonderer Dank an @rvignacio):
Dies ist eine Besonderheit in der Go-Syntax:
func eat(args ...interface{}) {}
func eatWithSpice(spice string, args ...interface{}) {}
func main() {
eat(returnPair()) // this works
eatWithSpice("pepper", returnPair()) // this does not
}
Als Sonderfall gilt: Wenn die Rückgabewerte einer Funktion oder Methode g in ihrer Anzahl gleich sind und einzeln den Parametern einer anderen Funktion oder Methode f zugewiesen werden können, ruft der Aufruf f(g(parameters_of_g)) f auf, nachdem die Rückgabewerte gebunden wurden von g zu den Parametern von f in der Reihenfolge.Der Aufruf von f darf außer dem Aufruf von g keine weiteren Parameter enthalten und g muss mindestens einen Rückgabewert haben.Wenn f ein Finale hat ...Parameter werden ihm die Rückgabewerte von g zugewiesen, die nach der Zuweisung regulärer Parameter übrig bleiben. (http://golang.org/ref/spec#Calls)
Lösung
Sie können diese Rückgabewerte zuerst zuweisen:
a, b := returnPair()
log.Printf("Returned %d %d", a, b
Ein Beispiel finden Sie in „Mehrere Rückgabewerte von Go-Funktionen".
Verwenden eines mehrfachen Rückgabewerts direkt in Println
funktioniert aber (da es akzeptiert Variadische Parameter):
In Ihrem Fall: play.golang.org
package main
import "log"
func returnPair() (a int, b int) {
return 42, 24
}
func main() {
log.Println(returnPair())
}
Ausgabe:
2009/11/10 23:00:00 42 24
Andere Tipps
I aprrove the method of VonC, which is cleaner, but if you really want, you can get inspired by the Must()
kind of function and do something like this:
http://play.golang.org/p/_dik4rSFBC
package main
import "fmt"
func returnPair() (int, int) {
return 42, 24
}
func displayPair(a, b interface{}) string {
return fmt.Sprint(a, b)
}
func main() {
fmt.Printf("pair: %v\n", displayPair(returnPair()))
}
EDIT:
Or more generic:
http://play.golang.org/p/DjPur-aatt
package main
import "fmt"
func returnPair() (int, int) {
return 42, 24
}
func returnTriple() (int, int, int) {
return 42, 24, 10
}
func displayPair(elem ...interface{}) string {
return fmt.Sprint(elem...)
}
func main() {
fmt.Printf("pair: %v, triple %v\n", displayPair(returnPair()), displayPair(returnTriple()))
}