These are the results of exploring one aspect of the Go language; functions can return multiple values. Consider the following simple function:
func ab() (a,b int) {
a,b = 1,2
return
}
Clearly, this function cannot be used in other function calls that expect a single value.
fmt.Printf("%v\n",ab())
The compiler will help you: “multiple-value ab() in single-value context”.
Now suppose you want to take only the first value without introducing an intermediate variable. One possible solution might be to create this helper function:
func first(args ...interface{})interface{} {
return args[0]
}
Such that you can write:
fmt.Printf("%v\n",first(ab()))
But what if you want to generalize this such that you won’t end up with functions like second(),third(),… To achieve this, I tried the following:
func pick(index int, args ...interface{})interface{} {
return args[index]
}
fmt.Printf("%v\n",pick(1,ab()))
However, again the compiler prompts with the same error message: “multiple-value ab() in single-value context”. It is my interpretation that the compiler (in this case) cannot implicitly convert the multiple returns into a slice because of the extra function parameter.
So instead I created this slice converter function:
func slice(args ...interface{}) []interface{} {
return args
}
And with that, you can write:
fmt.Printf("%v\n",slice(ab())[1])