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

关于 defer 行为的 Go 语言面试问题

关于 defer 行为的 Go 语言面试问题

Go
墨色风雨 2023-08-14 17:20:33
我有两个代码示例:func test() int {    var x int    defer func() {        x++    }()    x = 1    return x}func main() {    fmt.Println(test())}它返回:1。但是,以下代码示例的行为有所不同:func test() (x int) {    defer func() {        x++    }()    x = 1    return}func main() {    fmt.Println(test())}它返回2。
查看完整描述

1 回答

?
慕侠2389804

TA贡献1719条经验 获得超6个赞

Golang 规范对于 defer 语句是这样说的:

[...]如果延迟函数是函数文字并且周围函数具有在该文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。

(我的重点)

在您的第一个片段中,函数test没有命名返回参数;x只是一个局部变量。因此,您的 defer 语句无法修改 function 的结果test

在第二个代码片段中,函数test有一个命名的返回参数x,该参数位于函数文字的范围内。因此, defer 语句可以(并且确实)修改 function 的结果test


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

添加回答

举报

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