我对返回值使用'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。所以,问题是两个函数之间有什么区别。
答案 0 :(得分:4)
这两个功能有什么区别?
The Go Programming Language Specification
“ defer”语句调用一个函数,该函数的执行被推迟到 当周围的功能返回时。
每次执行“ defer”语句时,函数值和 与往常一样评估该呼叫的参数并重新保存,但 实际功能未调用。相反,延迟函数是 在周围的函数返回之前立即调用 按照相反的顺序进行延迟。
如果延迟函数是函数文字和周围 函数已命名结果参数,这些参数在 字面意义上,延迟函数可以访问和修改结果 参数在返回之前。如果延迟功能具有任何 返回值,函数完成后将被丢弃。
区别是带有命名结果参数的环绕函数
func a() (i int)
相对于带有未命名结果参数的周围函数
func a() int