分享
  1. 首页
  2. 文章

golang 基础(5)函数的返回值

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

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 语言是比较严格语言

strict-inspection.jpg
a, b := div(17,3)
 fmt.Println(a)

应该修改为,通过 _ 占位符来忽略掉不使用的变量

a, _ := div(17,3)
 fmt.Println(a)

到现在为止我想大家都理解了 go 语言的返回多个返回值的用法,那么实际中如何使用这个呢?我们之前调用读取文件时候,或打开文件时,这些函数通常都会返回两个返回值例如 file, error ,这一点又让我想起了 nodejs 中的异步操作基本也都是这个样子。


nodejs-vs-golang.jpg

那么我们来改造一下之前的 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)
  • 函数返回多个值时可以起名字
  • 仅用于非常简单的函数
  • 对于调用者没有区别


    Golang1.png

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

本文来自:简书

感谢作者:zidea

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

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏