golang 基础(10)函数返回值

zidea · · 4412 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

square-gopher.png

返回值

在 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 中的异步操作基本也都是这个样子。


![images.png](https://upload-images.jianshu.io/upload_images/8207483-f72b0cfad99f0b4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

那么我们来改造一下之前的 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!")
    }()
}
images.png

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:zidea

查看原文:golang 基础(10)函数返回值

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4412 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传