使用defer时函数中的返回值



我对返回值使用'defer'有一些问题。我尝试以不同的方式运行一个测试函数(只有I的定义不同),但结果不同。所以,我对不同的返回值感到困惑。问题是:

功能1:

package main
import "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: 1
a return: 0

功能2:

package main
import "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: 1
a return: 1

其中一个返回值为0,另一个为1。所以,问题是这两个函数之间有什么区别。

这两个函数之间有什么区别?


Go编程语言规范

延期声明

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

每次执行"defer"语句时,函数值和调用的参数将照常评估并重新保存,但实际函数不会被调用。相反,延迟函数是在环境函数返回之前立即调用相反,他们被推迟了。

如果延迟函数是函数文字和周围函数具有在literal,延迟函数可以访问和修改结果参数,然后再返回。如果延迟函数有返回值时,它们将在函数完成时被丢弃。


区别在于具有命名结果参数的周围函数

func a() (i int)

相对于具有未命名结果参数的周围函数

func a() int

最新更新