【问题标题】:What is the meaning of 'defer' in go? [duplicate]go中的'defer'是什么意思? [复制]
【发布时间】:2018-06-08 15:58:36
【问题描述】:

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
 }

【问题讨论】:

  • defer 语句将函数的执行推迟到周围的函数返回。延迟调用的参数会立即计算,但函数调用在周围的函数返回之前不会执行。

标签: go deferred


【解决方案1】:

defer 接受一个函数,所以fmt.Println(i) 是一个函数,并且在评估 defer 语句时,它的参数 i 被评估为 0。

defer func() { fmt.Println(i) },func() { fmt.Println(i) } 不带参数,它是一个闭包,所以i 不被评估,而是被闭包关闭。

您可以在https://gobyexample.com/closures了解更多关于关闭的信息

【讨论】:

  • 哦,对不起。我犯了一个错误,忘记了它的论点。
【解决方案2】:

函数参数被评估,但不是函数本身。

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

在第二种情况下,没有要评估的参数。但是函数包含来自外部函数的值。因此它可以直接访问其实际值。

您可以在不关闭的情况下获得相同的结果。传递变量i 的地址。逻辑是相同的:计算地址并将其传递给函数。拥有这个地址函数可以访问实际变量值。试试看它是如何工作的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-10
    • 2020-10-27
    • 2015-07-15
    • 2018-07-17
    • 2012-08-13
    • 1970-01-01
    • 2015-11-03
    • 2019-09-12
    相关资源
    最近更新 更多