Golang函数多个返回值
Go
允许函数有多个返回值,其定义结构如下:
func SumProdDiff(i, j int) (int, int, int)
由于有多个返回值,需要用 ()
括起来。在上述函数内部,返回时,应该如下书写 return
语句:
return sum, prod, diff
调用时,通过赋值操作符
s, p, d := SumProdDiff(value1, value2)
如果在 return
语句中返回值的数目和定义的不同,会产生 not enough arguments to return error.
编译错误。
在函数定义时,也可以声明返回值的名字,这一部分在之后会介绍,其定义结构类似如下所示:
func SumProdDiff(i, j int) (s int, p int, d int)
多个返回值
下面代码中,定义一个函数,同时返回两个数的和、乘积和差值。
package main
import (
"fmt"
)
func SumProductDiff(i, j int) (int, int, int) {
return i+j, i*j, i-j
}
func main() {
sum, prod, diff := SumProductDiff(3,4)
fmt.Println("Sum:", sum, "| Product:",prod, "| Diff:", diff)
}
Sum: 7 | Product: 12 | Diff: -1
通过多个返回值处理错误
通过多个返回值,可以有效的处理错误的发生。典型的处理方式如下:
retValue, err := my_function()
if err == nil { //go ahead with normal code
} else { //error handling code
}
在下面的代码中,实现一个求取平方根的函数。当遇到负数时,直接返回错误。调用函数,可以在执行之后的函数之前对是否产生错误进行检查。下面的代码写的比较拙劣,主要为了说明使用。
package main
import (
"fmt"
"errors"
"math"
)
func MySqrt(f float64) (float64, error) {
//return an error as second parameter if invalid input
if (f < 0) {
return float64(math.NaN()), errors.New("I won't be able to do a sqrt of negative number!")
}
//otherwise use default square root function
return math.Sqrt(f), nil
}
func main() {
fmt.Print("First example with -1: ")
ret1, err1 := MySqrt(-1)
if err1 != nil {
fmt.Println("Error! Return values are", ret1, err1)
} else {
fmt.Println("It's ok! Return values are", ret1, err1)
}
fmt.Print("Second example with 5: ")
//you could also write it like this
if ret2, err2 := MySqrt(5); err2 != nil {
fmt.Println("Error! Return values are", ret2, err2)
} else {
fmt.Println("It's ok! Return values are", ret2, err2) }
}
First example with -1: Error! Return values are NaN I won't be able to do a sqrt of negative number!
Second example with 5: It's ok! Return values are 2.23606797749979
返回值命名
Go
允许在定义函数时,命名返回值,当然这些变量可以在函数中使用。在 return
语句中,无需显示的返回这些值,Go
会自动将其返回。当然 return
语句还是必须要写的,否则编译器会报错。
在函数中定义的返回值变量,会自动赋为 zero-value
。也就是说变量会自动进行初始化- int
类型初始化为 0
,string
初始化为 ""
, 结构体则根据其组成部分初始化。
package main
import (
"fmt"
"errors"
"math"
)
//name the return variables - by default it will have 'zero-ed' values i.e. numbers are 0, string is empty, etc.
func MySqrt2(f float64) (ret float64, err error) {
if (f < 0) {
//then you can use those variables in code
ret = float64(math.NaN())
err = errors.New("I won't be able to do a sqrt of negative number!")
} else {
ret = math.Sqrt(f)
//err is not assigned, so it gets default value nil
}
//automatically return the named return variables ret and err
return
}
func main() {
fmt.Println(MySqrt2(5))
}
2.23606797749979 <nil>
注意,可以显示的更改返回值。上述代码中,如果写 return 5, nil
,命名变量将会被忽略,返回的真正值为 5, nil
Golang一种神奇的语言,让我们一起进步