”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么`defer'影响命名返回值的影响与GO中的输入参数不同?

为什么`defer'影响命名返回值的影响与GO中的输入参数不同?

发布于2025-03-04
浏览:770

Why Does `defer` Affect Named Return Values Differently Than Input Parameters in Go?
理解defer对GO

在GO中的变量声明的效果,即使发生恐慌,使用defer关键字允许在返回时执行代码的函数,即使发生parics。但是,当涉及在函数中以不同方式声明的变量时,结果可能会变化,导致混乱。

消失的增量

的奥秘。 defer func(){i}()() 返回i } func main(){ fmt.println(c(0))//打印0 }

在此示例中,我们将其称为c函数并将其传递为值0。但是,当我们打印结果时,我们得到0而不是预期1。这是因为我被声明为函数的输入参数。一旦执行返回语句,调用了延期函数,但是增量对返回值没有影响。

命名结果的魔法

与上一个示例相反,让我们考虑以下代码:

func c1(int) defer func(){i}()() 返回i } func main(){ fmt.println(c1())//打印1 }

func c(i int) int {
    defer func() { i   }()
    return i
}

func main() {
    fmt.Println(c(0)) // Prints 0
}
在此示例中,返回语句在调用延期函数之前将i明确设置为2。结果,延迟函数会增加i的值,返回值变为3。

命名结果参数的幂

这些示例的关键要点是输入参数和命名结果参数之间的区别。输入参数传递到函数中,而命名结果参数是保存函数返回值的变量。执行返回语句后,递送函数可以修改命名的结果参数,但它们不能影响输入参数。
最新教程 更多>

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3