2014-11-01 10 views
1

Короткий вопрос, на который я не нашел ответа на SO: как написать композитные вызовы функций, когда внутренняя функция имеет несколько возвращаемых значений?Композиция функций с множеством значений Golang

Вопрос: можете ли вы наложить только одно из значений из функции с несколькими значениями без использования переменной temp?

Пример: 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

Это работает, но это не совсем так - здесь мы просто переназначаем множественное возвращение к одной переменной и возвращаем его, поэтому мы по-прежнему составляем только однозначные функции. –

+0

Это ваш единственный вариант. – peterSO

+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.

Go 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() 
}