Golang初级系列教程-函数多个返回值

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 类型初始化为 0string 初始化为 "", 结构体则根据其组成部分初始化。

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一种神奇的语言,让我们一起进步

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值