4

我想调用我的函数测试并使用其中一个返回值。我怎么说给我第一个或第二个值?我认为下面会给我“一个”,但[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 索引的数组、切片、字符串或映射 a 的元素。值 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 回答