4

関数テストを呼び出して、戻り値の 1 つを使用したいと考えています。1 番目または 2 番目の値を教えてください。以下で「1」が得られると思いましたが、[1]間違った使用法でコンパイルエラーが発生しました

package main

import (
    "fmt"
)

func test() (int, string) { return 1, "one"; }

func main() {
    i,sz:=test()
    fmt.Printf("%d=%s\n",i,sz)
    fmt.Printf("%s", test()[1]) //error
}
4

2 に答える 2

4

私の知る限り、関数の戻り値に添字を付けることはできません。できるよ:

_, someString := test();
fmt.Println(someString);
于 2013-06-25T18:45:14.763 に答える
3

Go言語仕様の引用:

形式の一次式は、a[x] x でインデックス付けされた配列、スライス、文字列、またはマップの要素を示します。値 x は、それぞれインデックス キーまたはマップ キーと呼ばれます。[...] それ以外の場合 [a が配列、スライス文字列、またはマップでない場合] a[x] は不正です。

ただし、Go の複数の戻り値は返される配列ではなく、別の言語機能です。配列は単一の型の要素しか保持できませんが、戻り値は異なる型になる可能性があるため、これはそうである必要があります。

しかし、戻り値は配列 (またはスライス、文字列、またはマップ) ではないため、a[x]言語仕様によると、構文は構文エラーです。その結果、@dav がすでに正しく述べているように、他の場所で使用するには、実際に戻り値を変数に割り当てる必要があります。


特殊なケースでは、変数の割り当てを避けるために、このちょっとしたトリビアを使用できる場合があります。

特殊なケースとして、関数またはメソッド g の戻り値の数が等しく、別の関数またはメソッド f のパラメーターに個別に割り当て可能な場合、呼び出し f(g(parameters_of_g)) は、戻り値をバインドした後に f を呼び出します。 g の f のパラメーターに順番に。

これにより、次のことが可能になります。

func foo() (int, string) {
    return 42, "test";
}

func bar(x int, s string) {
    fmt.Println("Int: ", x);
    fmt.Println("String: ", s);
}

func main() {
    bar(foo())
}
于 2013-06-25T21:42:37.643 に答える