4

複数の値を返す関数の結果を記録する慣用的な方法はありますか? これはコンパイルされません:

import "log"
func returnPair() (int,int) {
    return 42, 24
}
func main() {
    log.Printf("Returned %v", returnPair())
}

prog.go:7: multiple-value returnPair() in single-value context

UPD の概要 (@rvignacio に特に感謝):

これは Go 構文の特徴です。

func eat(args ...interface{}) {}

func eatWithSpice(spice string, args ...interface{}) {}

func main() {
    eat(returnPair()) // this works
    eatWithSpice("pepper", returnPair()) // this does not
}

特殊なケースとして、関数またはメソッド g の戻り値の数が等しく、別の関数またはメソッド f のパラメーターに個別に割り当て可能な場合、呼び出し f(g(parameters_of_g)) は戻り値をバインドした後に f を呼び出します。 g の f のパラメーターに順番に。f の呼び出しには、g の呼び出し以外のパラメーターを含めてはならず、g には少なくとも 1 つの戻り値が必要です。f に最後の ... パラメータがある場合、通常のパラメータの割り当て後に残る g の戻り値が割り当てられます。( http://golang.org/ref/spec#Calls )

4

2 に答える 2

3

これらの戻り値を最初に割り当てることができます。

a, b := returnPair()
log.Printf("Returned %d %d", a, b

「 Go 関数からの複数の戻り値」で例を確認できます。

ただし、複数の戻り値を直接使用しても機能します(可変引数Printlnを受け入れるため):

あなたの場合:play.golang.org

package main

import "log"

func returnPair() (a int, b int) {
    return 42, 24
}
func main() {
    log.Println(returnPair())
}

出力:

2009/11/10 23:00:00 42 24
于 2014-07-30T18:35:04.293 に答える
2

よりクリーンな VonC のメソッドを承認しますが、本当に必要な場合はMust()、関数の種類に触発されて、次のようなことを行うことができます。

http://play.golang.org/p/_dik4rSFBC

package main

import "fmt"

func returnPair() (int, int) {
    return 42, 24
}

func displayPair(a, b interface{}) string {
    return fmt.Sprint(a, b)
}

func main() {
    fmt.Printf("pair: %v\n", displayPair(returnPair()))
}

編集:

またはより一般的な:

http://play.golang.org/p/DjPur-aatt

package main

import "fmt"

func returnPair() (int, int) {
    return 42, 24
}

func returnTriple() (int, int, int) {
    return 42, 24, 10
}

func displayPair(elem ...interface{}) string {
    return fmt.Sprint(elem...)
}

func main() {
    fmt.Printf("pair: %v, triple %v\n", displayPair(returnPair()), displayPair(returnTriple()))
}
于 2014-07-30T18:38:53.903 に答える