> For the complete documentation index, see [llms.txt](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wskdsgcf.gitbook.io/mastering-go-zh-cn/06.0/06.2/06.2.2.md).

# 06.2.2 多返回值的函数

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

```go
func aFunction() (int, int, float64, string){
}
```

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

`functions.go` 的第一段代码如下：

```go
package main

import (
    "fmt"
    "os"
    "strconv"
)
```

`functions.go` 的第二段代码如下：

```go
func doubleSquare(x int) (int, int) {
    return x * 2, x * x
}
```

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

`functions.go` 的第三部分如下：

```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` 的第四部分包含如下代码：

```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` 的最后一部分如下：

```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
```
