首页 > 编程笔记

Go语言函数的返回值

Go 语言的函数支持多返回值,多返回值能方便地获得函数执行后的多个返回参数。

Go 语言经常使用多返回值中的最后一个返回参数返回函数执行中可能发生的错误,例如:
conn, err := connectToNetwork()
connectToNetwork 返回两个参数,conn 表示连接对象,err 表示返回的错误信息。

Go 语言既支持安全指针,也支持多返回值,因此在使用函数进行逻辑编写时更为方便。

同一种类型返回值

如果返回值是同一种类型,则用括号将多个返回值类型括起来,用逗号分隔每个返回值的类型。

使用 return 语句返回时,值列表的顺序需要与函数声明的返回值类型一致,例如:
func typedTwoValues() (int, int) {
    return 1, 2
}
func main() {
    a, b := typedTwoValues()
    fmt.Println(a, b)
}
运行结果如下:

1 2

纯类型的返回值对于代码可读性不是很友好,特别是在同类型的返回值出现时,无法区分每个返回参数的意义。

带有变量名的返回值

Go语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型。

命名的返回值变量的默认值为类型的默认值,即数值为 0,字符串为空字符串,布尔值为 false,指针为 nil。

在以下代码中,函数拥有两个整型返回值,函数声明时将返回值命名为 a 和 b,因此,可以在函数体中直接对函数返回值进行赋值,在命名的返回值方式的函数体中,在函数结束前需要显式地使用 return 语句进行返回。
func namedRetValues() (a, b int) {
    a = 1
    b = 2
    return
}
在以上代码中:
第 1 行,对两个整型返回值进行命名,分别为 a 和 b。

第 2 行和第 3 行,命名返回值的变量与这个函数的布局变量的效果一致,可以对返回值进行赋值和值获取。

第 4 行,当函数使用命名返回值时,可以在 return 中不填写返回值列表,如果填写也是可行的,下面代码的执行效果和上面代码的效果一样。
func namedRetValues() (a, b int) {
    a = 1
    return a, 2
}
需要注意的是,同一种类型返回值和命名返回值两种形式只能二选一,混用时将会发生编译错误,例如:
func namedRetValues() (a, b int, int)
编译器报错提示:
mixed named and unnamed function parameters
即在函数参数中混合使用了命名和非命名参数。

注意,如果只有一个返回值且不声明返回值变量,那么可以省略返回值(包括返回值的括号都可以不写)。如果没有返回值,那么就直接省略最后的返回信息,什么都不用写;如果有返回值,那么必须在函数的最后添加 return 语句。

推荐阅读