多返回值的函数
如您已经从 strconv.atoi()
等函数所知,Go 函数可以返回多个不同的值,这就避免了您必须创建一个专用的结构,以便能够同时从一个函数接收多个值。您可以声明一个如下返回四个值的函数,两个 int
值,一个 float64
值和一个 string
:
func aFunction() (int, int, float64, string){
}
现在来以 functions.go
做例子来说明匿名函数和返回多值的函数。相关代码分五部分来介绍。
functions.go
的第一段代码如下:
package main
import (
"fmt"
"os"
"strconv"
)
functions.go
的第二段代码如下:
func doubleSquare(x int) (int, int) {
return x * 2, x * x
}
这里您可以看到一个名为 doubleSquare()
函数的定义和实现,它只需要一个 int
参数并返回两个 int
值。
functions.go
的第三部分如下:
func main() {
arguments := os.Args
if len(arguments) != 2 {
fmt.Println("The program needs 1 argument!")
return
}
y, err := strconv.Atoi(arguments[1])
if err != nil {
fmt.Println(err)
return
}
上面的代码处理程序的命令行参数。
functions.go
的第四部分包含如下代码:
square := func(s int) int {
return s * s
}
fmt.Println("The squre of", y, "is", square(y))
double := func(s int) int {
return s + s
}
fmt.Println("The double of", y, "is", double(y))
square
和 double
变量分别对应一个匿名函数。糟糕的部分是 squre
,double
的值或任何其他对应匿名函数的变量值可以被修改,这意味着,这些变量能修改和计算其他的。
不要认为可以修改匿名函数变量的代码是好的程序实现,因为这可能是错误的根源!
functions.go
的最后一部分如下:
fmt.Println(doubleSquare(y))
d, s := doubleSquare(y)
fmt.Println(d, s)
}
您可以打印如 doubleSquare()
函数的返回值,也可以把它们分配给其他变量。
执行 functions.go
产生如下输出:
$go run functions.go 1 21
The program needs 1 argument!
rMackBook: code mtsouk
$go run functions.go 10
The square of 10 is 100
The double of 10 is 20
20 100
20 100