猿问

关于 defer 行为的 Go 语言面试问题

我有两个代码示例:


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。


墨色风雨
浏览 97回答 1
1回答

慕侠2389804

Golang 规范对于 defer 语句是这样说的:[...]如果延迟函数是函数文字并且周围函数具有在该文字范围内的命名结果参数,则延迟函数可以在返回结果参数之前访问和修改结果参数。(我的重点)在您的第一个片段中,函数test没有命名返回参数;x只是一个局部变量。因此,您的 defer 语句无法修改 function 的结果test。在第二个代码片段中,函数test有一个命名的返回参数x,该参数位于函数文字的范围内。因此, defer 语句可以(并且确实)修改 function 的结果test。
随时随地看视频慕课网APP

相关分类

Go
我要回答