使用延迟时函数中的返回值

时间:2018-12-25 01:32:15

标签: go

我对返回值使用'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。所以,问题是两个函数之间有什么区别。

1 个答案:

答案 0 :(得分:4)

  

这两个功能有什么区别?


  

The Go Programming Language Specification

     

Defer statements

     

“ defer”语句调用一个函数,该函数的执行被推迟到   当周围的功能返回时。

     

每次执行“ defer”语句时,函数值和   与往常一样评估该呼叫的参数并重新保存,但   实际功能未调用。相反,延迟函数是   在周围的函数返回之前立即调用   按照相反的顺序进行延迟。

     

如果延迟函数是函数文字和周围   函数已命名结果参数,这些参数在   字面意义上,延迟函数可以访问和修改结果   参数在返回之前。如果延迟功能具有任何   返回值,函数完成后将被丢弃。


区别是带有命名结果参数的环绕函数

func a() (i int)

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

func a() int