为了账号安全,请及时绑定邮箱和手机立即绑定

使用 defer 时在函数中返回值

使用 defer 时在函数中返回值

Go
翻翻过去那场雪 2023-05-22 16:55:29
我对返回值使用“延迟”有一些问题。我尝试以不同的方式运行一个测试函数(只是 i 的定义不同),但结果不同。所以,我对不同的返回值感到困惑。这是问题所在:功能 1:package mainimport "fmt"func main() {    fmt.Println("a return:", a()) // return value: 0}func a() int {    var i int    defer func() {        i++        fmt.Println("a defer1:", i) // print " a defer1: 1"    }()    return i}返回值:a defer1: 1a return: 0功能2:package mainimport "fmt"func main() {    fmt.Println("a return:", a()) // return value: 1}func a() (i int) {    defer func() {        i++        fmt.Println("a defer1:", i) // print " a defer1: 1"    }()    return i}返回值:a defer1: 1a return: 1一个返回值是0,另一个是1。所以,问题是这两个函数有什么区别。
查看完整描述

1 回答

?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

这两个功能有什么区别?


Go 编程语言规范

推迟声明

“延迟”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻。

每次执行“defer”语句时,调用的函数值和参数都会像往常一样计算并重新保存,但不会调用实际函数。相反,延迟函数会在周围函数返回之前立即被调用,顺序与它们被延迟的顺序相反。

如果延迟函数是一个函数文字,并且周围的函数在文字范围内命名了结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。如果延迟函数有任何返回值,它们将在函数完成时被丢弃。


不同之处在于带有命名结果参数的周围函数

func a() (i int)

与具有未命名结果参数的周围函数

func a() int


查看完整回答
反对 回复 2023-05-22
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信