返回值
在 go 语言中函数支持多个返回值
func div(a, b int) (int, int){
return a /b , a %b
}
我们也可以给函数返回值打上标签 q, r
func div(a, b int) (q,r int){
return a /b , a %b
}
我们可以用两个变量来接受函数返回值
a, b := div(17,3)
如果我们只想使用一个返回值,也就是 a 而不使用 b,向下面这样做会在编译时报错,go 语言是比较严格语言
a, b := div(17,3)
fmt.Println(a)
应该修改为,通过 _ 占位符来忽略掉不使用的变量
a, _ := div(17,3)
fmt.Println(a)
到现在为止我想大家都理解了 go 语言的返回多个返回值的用法,那么实际中如何使用这个呢?我们之前调用读取文件时候,或打开文件时,这些函数通常都会返回两个返回值例如 file, error ,这一点又让我想起了 nodejs 中的异步操作基本也都是这个样子。
那么我们来改造一下之前的 eval ,让这个函数也返回两个值,其中包括一个错误值而不是在函数内部处理错误。
func eval(a, b int,op string) (int, error) {
switch op {
case "+":
return a + b, nil
case "-":
return a - b, nil
case "*":
return a * b, nil
case "/":
return a / b, nil
default:
return 0, fmt.Errorf("unsupported operation: %s" + op)
}
}
if result, err := eval(3,4, "*"); err != nil{
fmt.Println("Error",err)
}else{
fmt.Println(result)
}
可以返回一个指针,在 go 中我们将函数 sum 内部局部变量的 result 的内存地址作为返回值。如果有其他语言经验,这里会有点疑惑,我们函数中的局部变量不是和函数都放入执行栈中吗,这些局部变量随着函数执行完毕会被释放吗,而在 go 中如果你返回局部变量的地址,这个变量会升级到堆内存。
func sum(values ...int) *int {
result := 0
for _, v := range values{
result += v
}
return &result
}
s := sum(1,2,3)
fmt.Println("The sum is ", *s)
- 函数返回多个值时可以起名字
- 仅用于非常简单的函数
- 对于调用者没有区别
在 go 语言中函数也是一等公民,也就是所谓高阶函数
我们定义匿名函数,() 括号来立即调用这个函数,如果你是 JavaScript 的开发人员这个多眼熟呀。
func main(){
func(){
fmt.Println("Hello Go!")
}()
}
有疑问加站长微信联系(非本文作者)