温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

return如何正确的在golang中使用

发布时间:2020-12-16 14:19:38 来源:亿速云 阅读:643 作者:Leah 栏目:开发技术

这期内容当中小编将会给大家带来有关 return如何正确的在golang中使用,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

golang函数如果返回值定义了变量,return后边必须跟着表达式或者值

func main() {  fmt.Println("-------", test()) } func test() (n string) {  n = "hello"  return }

如果没有定义变量,return必须显示地返回对象

func main() {  fmt.Println("-------", test()) } func test() string {  n := "hello"  return n }

补充:Golang中defer、return、返回值之间执行顺序的坑

Go语言中延迟函数defer充当着 cry...catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白defer、return和返回值之间的执行顺序,从而掉进坑中,今天我们就来揭开它的神秘面纱!

先来运行下面两段代码:

A. 无名返回值的情况

package main  import (  "fmt" )   func main() {  fmt.Println("return:", a()) // 打印结果为 return: 0 }   func a() int {  var i int  defer func() {  i++  fmt.Println("defer2:", i) // 打印结果为 defer: 2  }()  defer func() {  i++  fmt.Println("defer1:", i) // 打印结果为 defer: 1  }()  return i }<br><br>

B. 有名返回值的情况

package main   import (  "fmt" )   func main() {  fmt.Println("return:", b()) // 打印结果为 return: 2 }   func b() (i int) {  defer func() {  i++  fmt.Println("defer2:", i) // 打印结果为 defer: 2  }()  defer func() {  i++  fmt.Println("defer1:", i) // 打印结果为 defer: 1  }()  return i // 或者直接 return 效果相同 }

先来假设出结论,帮助大家理解原因:

1、多个defer的执行顺序为“后进先出”;

2、defer、return、返回值三者的执行逻辑应该是:return最先执行,return负责将结果写入返回值中;接着defer开始执行一些收尾工作;最后函数携带当前返回值退出。

如何解释两种结果的不同:

上面两段代码的返回结果之所以不同,其实从上面第2条结论很好理解。

a()int 函数的返回值没有被提前声名,其值来自于其他变量的赋值,而defer中修改的也是其他变量,而非返回值本身,因此函数退出时返回值并没有被改变。

b()(i int) 函数的返回值被提前声名,也就意味着defer中是可以调用到真实返回值的,因此defer在return赋值返回值 i 之后,再一次地修改了 i 的值,最终函数退出后的返回值才会是defer修改过的值。

C. 下面我们再来看第三个例子,验证上面的结论:

package main  import (  "fmt" )   func main() {  fmt.Println("c return:", *(c())) // 打印结果为 c return: 2 }   func c() *int {  var i int  defer func() {  i++  fmt.Println("c defer2:", i) // 打印结果为 c defer: 2  }()  defer func() {  i++  fmt.Println("c defer1:", i) // 打印结果为 c defer: 1  }()  return &i }

虽然 c()*int 的返回值没有被提前声明,但是由于 c()*int 的返回值是指针变量,那么在return将变量 i 的地址赋给返回值后,defer再次修改了 i 在内存中的实际值,因此函数退出时返回值虽然依旧是原来的指针地址,但是其指向的内存实际值已经被成功修改了。

上述就是小编为大家分享的 return如何正确的在golang中使用了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI