06.2.2 多返回值的函数

如您已经从 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))

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

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

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

Last updated