假设在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语句的文章.
找到了弗拉基米尔·维维恩(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)