我有两个代码示例: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
。
- 1 回答
- 0 关注
- 96 浏览
添加回答
举报
0/150
提交
取消