Domanda

C'è un modo idiomatico per registrare il risultato di una funzione che restituisce più valori?Questo non si compilerà:

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
.

Richiesta di aggiornamento (speciale grazie a @Rvignacio):

Questa è una peculiarità in GO Sintassi:

func eat(args ...interface{}) {}

func eatWithSpice(spice string, args ...interface{}) {}

func main() {
    eat(returnPair()) // this works
    eatWithSpice("pepper", returnPair()) // this does not
}
.

come caso speciale, se i valori di ritorno di una funzione o del metodo G sono uguali in numero e assegnabili individualmente ai parametri di un'altra funzione o metodo F, quindi la chiamata F (G (parameters_of_g)) invocheràf dopo aver vincolato i valori di ritorno di G ai parametri di F in ordine.La chiamata di F deve contenere parametri diversi dalla chiamata di G, e G deve avere almeno un valore di restituzione.Se F ha un finale ... Parametro, viene assegnato i valori di ritorno di G che rimangono dopo l'assegnazione dei parametri regolari. ( http://golang.org/ref/spec#calls )

È stato utile?

Soluzione

È possibile assegnare prima i valori di ritorno:

a, b := returnPair()
log.Printf("Returned %d %d", a, b
.

Puoi vedere un esempio in " multipli valori di ritornoDalle funzioni Go ".

Utilizzo di un valore di ritorno multiplo direttamente in Println funziona però (poiché accetta Parametri VariaDIC ):

Nel tuo caso: play.golang.org

.
package main

import "log"

func returnPair() (a int, b int) {
    return 42, 24
}
func main() {
    log.Println(returnPair())
}
.

Uscita:

2009/11/10 23:00:00 42 24
.

Altri suggerimenti

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()))
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top