Go语言 围棋中的defer是什么意思?[副本]

siotufzp  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(109)

此问题已在此处有答案

Golang defer behavior(4个答案)
五年前就关门了。
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
 }
nwo49xxi

nwo49xxi1#

defer接受一个函数,所以fmt.Println(i)是一个函数,当计算defer语句时,其参数i被计算为0
defer func() { fmt.Println(i) }func() { fmt.Println(i) }没有参数,它是一个闭包,所以i不被计算,而是被闭包关闭。
您可以在https://gobyexample.com/closures上了解有关闭包的更多信息

6l7fqoea

6l7fqoea2#

函数参数被计算,但函数本身不被计算。
在第一种情况下,计算参数I,并准备将值0传递给函数。这就是为什么deferred函数打印0
在第二种情况下,没有参数需要评估。但是函数包含了来自外部函数的值。因此,它可以直接访问其实际值。
你可以在没有关闭的情况下达到同样的结果。传递变量i的地址。逻辑是一样的:地址被计算并传递给函数。有了这个地址函数就可以访问实际的变量值。试试看它是如何工作的。

相关问题