Golang:在函数中使用一个值来返回多个参数

dav*_*vid 21 go

假设在Go中我们有一个返回两个参数的函数

func squareAndCube(int side) (square int, cube int) {
    square = side * side
    cube = square * side
    return
}
Run Code Online (Sandbox Code Playgroud)

然后你想在条件中使用这个函数的第一个(第二个)值:

square, _ := squareAndCube(n)
if square > m {
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我们不需要在任何其他地方使用值square,我们可以在一行中前两行吗?例如

 if squareAndCube(n).First() > m {
     ...
 }
Run Code Online (Sandbox Code Playgroud)

nem*_*emo 28

您无法选择多个返回值中的一个,但您可以编写类似的内容

if square, _ := squareAndCube(n); square > m {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

square变量仅在if范围内有效.这些"简单语句"可用于if语句,switch语句和其他构造(如for循环).

另见有关go if语句的文章.


Eri*_*gan 7

找到了弗拉基米尔·维维恩(Vladimir Vivien)撰写的这篇博客文章,文章提供了解决该问题的不错方法。解决方案是创建一个函数,该函数“ ...利用编译器的自动转换功能,将以“ x ... interface {}”形式的vararg参数转换为标准[] interface {}。

func mu(a ...interface{}) []interface{} {
    return a
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以包装具有多个返回值的任何函数,mu并在返回的切片后加上类型声明来索引

package main

import(
    "fmt"
)

func mu(a ...interface{}) []interface{} {
    return a
}

func myFunc(a,b string) (string, string){
    return b, a
}

func main(){
    fmt.Println(mu(myFunc("Hello", "World"))[1].(string))
}

// output: Hello
Run Code Online (Sandbox Code Playgroud)