2014-11-01 32 views
1

我還沒有在SO上找到答案的簡短問題:當內部函數有多個返回值時,如何編寫複合函數調用?Golang多值函數組合

子問題:你可以只使用多值函數中的一個返回而不使用臨時變量嗎?

例子: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())) 
} 

回答

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())) 
} 
+0

這是有效的,但它不是真正的重點 - 在這裏我們只是重新分配多個返回一個變量並返回它,所以我們仍然只是實際構成單值函數。 – 2014-11-01 20:05:20

+0

這是您唯一的選擇。 – peterSO 2014-11-01 20:17:30

+0

好的,所以這是不可能的。好吧!謝謝。 – 2014-11-01 20:17:55

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 
} 
-3

你也可以返回一個返回多個值的函數。

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

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