go语言支持多返回值,可方便地获取函数调用后的多个返回值。
go语言经常使用多返回值中的最后一个参数返回函数执行中可能发生的错误。conn, err := connectToNetwork()
,上面的代码返回两个参数,conn表示连接对象,err返回错误。
下文中的”指定返回值”,仅指return后面直接跟着返回值。
1. 函数不指定返回值
package main
import (
"fmt"
)
// 函数返回值为空
func GetMoney(){
fmt.Println("money")
return
}
func main(){
GetMoney()
}
// money
2. 函数指定返回值
- 带有变量名的返回值(命名返回值)
go语言支持对返回值命名,这样返回值就有变量名和类型。命名返回值变量的默认值为类型零值,即数值为0,字符串为"",布尔值为false,指针为nil。
func namedRetValue () (a int, b int) {
a = 1 // 在函数体内,可以直接对命名返回值变量进行赋值和值获取
b = 2
return // 使用return语句,显式返回。可以不填写返回值列表,如果填写也行
}
func namedRetValue () (a int, b int) {
a = 1
return a, 2
}
上面两个代码块的执行效果一样。
package main
import (
"fmt"
)
// 函数返回值是一个常量
func GetMoney() (_amount int){ // 函数指定返回值的参数名和类型
_amount = 88
fmt.Println("money: ", _amount)
return _amount
}
func main(){
amount := GetMoney()
fmt.Println("money: ", amount)
}
/*
money: 88
money: 88
*/
- 函数返回值是一个整数
package main
import (
"fmt"
)
func GetMoney(_amount int){
fmt.Println("money: ", _amount)
return 88
}
func main(){
amount := GetMoney(11)
fmt.Println("money: ",amount)
}
/*
运行结果:
money: 0
money: 88
*/
实例:退出执行,指定返回值和指定默认值
package main
import (
"fmt"
)
func GetMoney() (_amount int){
_amount = 99 // 如果return后面没有指定返回值,就用常量_amount赋给“返回值变量amount”的值
fmt.Println("money: ",_amount)
return 88 // 如果return后面跟有返回值,就使用return后面的返回值,赋给“返回值变量amount”
}
func main(){
var amount = GetMoney()
fmt.Println("money: ",amount)
}
/*
运行结果:
money: 99
money: 88
*/
- 函数作为返回值
- 同一种类型返回值(我用)
使用return语句时,返回值的顺序需要与函数声明的返回值类型一致。
package func_test
import (
"testing"
)
func div(a, b int) (c int, d int) {
return a / b, a % b
}
func TestReturn(t *testing.T) {
c, d := div(17, 3)
t.Log(c, d)
}
注:如果返回值是同一种数据类型,则用括号包裹,用逗号分割每个返回值类型。如func div(a, b int) (int, int)。但是如果省略了返回值的参数名,在同类型的多返回值时,使用纯类型的代码可读性不好,无法区分每个返回值的含义。
如果我们只想使用其中一个返回值,如上文中的程序只获取商,应该通过占位符_来忽略掉不使用的变量。
package func_test
import (
"testing"
)
func div(a, b int) (c int, d int) {
return a / b, a % b
}
func TestReturn(t *testing.T) {
q, _ := div(17, 3)
t.Log(q)
}
- 注意事项
同一种类型返回值和命名返回值只能二选一,如果混用,将会报错:mixed named and unnamed function parameters.
func namedRetValue () (a, b int, int)