how to parse multiple returns in golang

InAFlash picture InAFlash · Oct 4, 2018 · Viewed 7k times · Source

I have a Go function which returns two integer values. Below is the function

func temp() (int, int){
 return 1,1
}

Is it possible to put temp function directly into a Println and print both the outputs using string formatting as below:

fmt.Println("first= %d and second = %d", temp() ) // This doesn't work

In Python, I am able to do the following:

def func():
    return 1,1
print("{0}={1}".format(*func())
>> '1=2'

Can I do Something similar in Go too?

Answer

maerics picture maerics · Oct 4, 2018

No, this is not possible. You must assign all values from a multi-value expression to separate variables to use them, e.g.:

a, b := temp()
fmt.Println("first = %d and second = %d", a, b)
// first = 1 and second = 1

[Edit]

Interestingly, it appears that in some cases you can use multi-value expressions as function call arguments if the argument types and arity match, or for purely variadic functions (Go Playground):

func oneTwo() (int, int) {
  return 1, 2
}

func incr2(x, y int) (int, int) {
  return x + 1, y + 1
}

func main() {
  incr2(oneTwo()) // OK: multi-value return and arguments match.

  fmt.Println(oneTwo()) // OK: pure variadic function.

  fmt.Printf("%d %d", oneTwo()) // ERR: mixed formal and variadic args.
}