Golang多值函数组合

时间:2014-11-01 19:31:33

标签: go function-composition

我没有在SO上找到答案的简短问题:当内部函数有多个返回值时,如何编写复合函数调用?

子问题:您是否可以在不使用临时变量的情况下从多值函数中转换其中一个返回值?

示例:http://play.golang.org/p/intnxkzSO1

package main

import "fmt"

func multiReturn() (int, int) {
    return 0, 1
}

func noOp(a int) int {
    return a
}

func main() {

    // Too many arguments
    fmt.Print(noOp(multiReturn()))

    // multiple-value in single-value context
    fmt.Print(string(multiReturn()))
}

3 个答案:

答案 0 :(得分:2)

您可以让外部函数与内部函数的返回值匹配

func multiReturn() (int, int) {
    return 10, 1
}

func noOp(a, _ int) int {
    return a
}

func main() {
    fmt.Printf("%v\n", noOp(multiReturn()))             // output: 10
    fmt.Printf("%s", strconv.Itoa(noOp(multiReturn()))) // output: 10
}

在旁注上字符串(int)不起作用,你必须使用strconv包。

转到play

另一种选择是使用variadic参数。

func noOp(a ...int) int {
    if len(a) > 0 {
        return a[0]
    }
    return 0
}

答案 1 :(得分:0)

例如,

package main

import "fmt"

func singleReturn() int {
    s, _ := multiReturn()
    return s
}

func multiReturn() (int, int) {
    return 0, 1
}

func noOp(a int) int {
    return a
}

func main() {

    fmt.Print(noOp(singleReturn()))
    fmt.Print(string(singleReturn()))

    // Too many arguments
    //fmt.Print(noOp(multiReturn()))

    // multiple-value in single-value context
    //fmt.Print(string(multiReturn()))
}

答案 2 :(得分:-3)

您还可以返回一个返回多个值的函数。

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

func g() (int, int) {
    return f()
}