go中'defer'是什么意思? [重复]

问题描述 投票:-4回答:2

这个问题在这里已有答案:

golang的文档说明了这一点:

在计算defer语句时,将计算延迟函数的参数。

这让我很困惑。

问题:“评估”是否意味着该值已知?我只是不明白为什么两个例子打印不同。这让我很困惑。

我有以下两个例子:

 //It prints 0.
 func deferA() {
     i := 0
     defer fmt.Println(i)
     i++
     return
 }

 //It prints 1.
 func deferB() {
      i := 0
      defer func() {
          fmt.Println(i)
      }()
      i++
      return
 }
go deferred
2个回答
3
投票

defer取一个函数,所以fmt.Println(i)是一个函数,当评估defer语句时,它的参数i被评估为0

defer func() { fmt.Println(i) }func() { fmt.Println(i) }不采取任何争论及其封闭,所以i没有被评估,但被封闭关闭。

您可以在https://gobyexample.com/closures获得有关关闭的更多信息


1
投票

函数参数被计算,但不是函数本身。

在第一种情况下,参数I被评估,并且值0准备传递给函数。这就是延迟功能打印0的原因。

在第二种情况下,没有评论的论据。但是函数从外部函数中包含值。因此它可以直接访问其实际价值。

没有关闭,您可以获得相同的结果。传递变量i的地址。逻辑是相同的:地址被计算并传递给函数。具有此地址功能可以访问实际变量值。尝试检查它是如何工作的。

© www.soinside.com 2019 - 2024. All rights reserved.