
为什么 go 中 defer 函数打印结果与预期不同?
在 go 中使用 defer 延迟执行函数时,可能会遇到打印结果与预期不同的情况。本文将解释一个常见的案例。
问题:
下方的 go 代码将打印什么结果?
package main
import "fmt"
func main() {
a := 1
defer func() { fmt.println(a) }()
defer func(a int) { fmt.println(a) }(a)
defer fmt.println(a)
a++
}答案:
打印结果是:
2 1 2
解释:
defer 遵循后进先出(lifo)原则,这意味着最后注册的函数将最先执行。对于上面的代码:
执行 defer 函数:
因此,最终打印的结果是 2、1 和 2。
还需要注意,在注册 defer 函数时,该函数的参数必须已确定其值。在上面的代码中,第二个 defer 函数的 a 参数在注册时被赋值为 1。当函数执行时,它仍将打印 1,即使 a 的值已在 main 函数中增加。
以上就是为什么 Go 中 defer 函数的打印结果与预期不一致?的详细内容,更多请关注php中文网其它相关文章!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号