go - defer和命名返回值的顺序是什么

标签 go

看看这两段代码:

// return 0
func f() int {
    res := 0 
    defer func(){
        res++
    }()
    return res
}

我知道defer表达式是在return表达式之后执行的。 但是当有一个命名的返回值时,为什么会有所不同呢? 为什么以下函数不返回 0

// return 1
func f() (res int) {
    res = 0 
    defer func(){
        res++
    }()
    return res
}

最佳答案

执行顺序为:

  1. return 语句设置结果参数。
  2. 延迟调用执行。
  3. 函数返回结果参数。

延迟函数可以在函数返回之前修改命名结果参数。

第一个示例中的延迟函数修改局部变量 res,而不是未命名的结果参数。函数 f 返回 0,因为 return 将结果参数设置为 0,并且延迟函数不会更改结果参数。

第二个函数返回 1,因为延迟函数修改了结果参数 res

关于go - defer和命名返回值的顺序是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69818560/

相关文章:

vector - 未定义的向量.New

go - 超过 max.poll.interval.ms 后,Kafka 消费者卡住了

bash - 如何使用Bash自动执行两个OS.Stdin输入

Git2go : Simulate git checkout and an immediate git push

json - 解码一个 json 流(不是换行符分隔的)

variables - 在范围循环中递增结构变量

arrays - Golang将2维数组拆分为一个维的多个数组

pointers - &Struct{} 与 Struct{} 之间的区别

http - golang 在 http.ListenAndServe 之后执行函数

go - 类型实现中的隐藏方法?