猿问

使用 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。所以,问题是这两个函数有什么区别。


翻翻过去那场雪
浏览 141回答 1
1回答

素胚勾勒不出你

这两个功能有什么区别?Go 编程语言规范推迟声明“延迟”语句调用一个函数,该函数的执行被推迟到周围函数返回的那一刻。每次执行“defer”语句时,调用的函数值和参数都会像往常一样计算并重新保存,但不会调用实际函数。相反,延迟函数会在周围函数返回之前立即被调用,顺序与它们被延迟的顺序相反。如果延迟函数是一个函数文字,并且周围的函数在文字范围内命名了结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。如果延迟函数有任何返回值,它们将在函数完成时被丢弃。不同之处在于带有命名结果参数的周围函数func a() (i int)与具有未命名结果参数的周围函数func a() int
随时随地看视频慕课网APP

相关分类

Go
我要回答