大佬们帮我看看这个 defer 的问题呗

2019-06-13 09:57:37 +08:00
 d0m2o08
package main

import (
	"fmt"
)

func main() {
	fmt.Println(testRet())
}

func testRet() int {
	var ret int
	defer func() {
		fmt.Println("执行了 defer")
		ret++
	}()
	return ret
}

这段代码为什么返回的是 0 不是 1 ? 是我姿势不对么

1963 次点击
所在节点    Go 编程语言
8 条回复
seaZhang
2019-06-13 10:09:50 +08:00
defer 在 return 之后
yph007595
2019-06-13 10:10:07 +08:00
你去看看 defer 和 return 的顺序就搞明白了
要想返回 1,应该这么写

func testRet() (ret int) {
defer func() {
fmt.Println("执行了 defer")
ret++
}()
return
}
SuperMild
2019-06-13 10:19:12 +08:00
如果这样,就会返回 3

func testRet() (ret int) {
defer func() {
fmt.Println("执行了 defer")
ret++
}()
return 2
}
lasuar
2019-06-13 10:23:20 +08:00
defer 是会执行,但是你 return 后面加了 ret,此时的 ret 是 0, 那你函数的返回值就已经定死,参考 2 楼
beidounanxizi
2019-06-13 10:33:41 +08:00
https://studygolang.com/articles/14831
https://blog.golang.org/defer-panic-and-recover
自己去看下哈 主要理解执行顺序 和 retvalue 含义
beidounanxizi
2019-06-13 10:36:00 +08:00
Deferred functions may read and assign to the returning function's named return values.

named return values 强调
SuperMild
2019-06-13 10:36:16 +08:00
@lasuar 和加了 ret 没关系,这样也返回 1

func testRet() (ret int) {
defer func() {
fmt.Println("执行了 defer")
ret++
}()
return ret
}
lasuar
2019-06-13 23:20:42 +08:00
@SuperMild OK,差点误导楼主。原来是 defer 操作对匿名返回值和命名返回值两种情况的处理不同导致的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/573450

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX