多返回值的函数

如您已经从 strconv.atoi() 等函数所知,Go 函数可以返回多个不同的值,这就避免了您必须创建一个专用的结构,以便能够同时从一个函数接收多个值。您可以声明一个如下返回四个值的函数,两个 int 值,一个 float64 值和一个 string

  1. func aFunction() (int, int, float64, string){
  2. }

现在来以 functions.go 做例子来说明匿名函数和返回多值的函数。相关代码分五部分来介绍。

functions.go 的第一段代码如下:

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "strconv"
  6. )

functions.go 的第二段代码如下:

  1. func doubleSquare(x int) (int, int) {
  2. return x * 2, x * x
  3. }

这里您可以看到一个名为 doubleSquare() 函数的定义和实现,它只需要一个 int 参数并返回两个 int 值。

functions.go 的第三部分如下:

  1. func main() {
  2. arguments := os.Args
  3. if len(arguments) != 2 {
  4. fmt.Println("The program needs 1 argument!")
  5. return
  6. }
  7. y, err := strconv.Atoi(arguments[1])
  8. if err != nil {
  9. fmt.Println(err)
  10. return
  11. }

上面的代码处理程序的命令行参数。

functions.go 的第四部分包含如下代码:

  1. square := func(s int) int {
  2. return s * s
  3. }
  4. fmt.Println("The squre of", y, "is", square(y))
  5. double := func(s int) int {
  6. return s + s
  7. }
  8. fmt.Println("The double of", y, "is", double(y))

squaredouble 变量分别对应一个匿名函数。糟糕的部分是 squredouble 的值或任何其他对应匿名函数的变量值可以被修改,这意味着,这些变量能修改和计算其他的。

不要认为可以修改匿名函数变量的代码是好的程序实现,因为这可能是错误的根源!

functions.go 的最后一部分如下:

  1. fmt.Println(doubleSquare(y))
  2. d, s := doubleSquare(y)
  3. fmt.Println(d, s)
  4. }

您可以打印如 doubleSquare() 函数的返回值,也可以把它们分配给其他变量。

执行 functions.go 产生如下输出:

  1. $go run functions.go 1 21
  2. The program needs 1 argument!
  3. rMackBook: code mtsouk
  4. $go run functions.go 10
  5. The square of 10 is 100
  6. The double of 10 is 20
  7. 20 100
  8. 20 100