Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 什么是';推迟';在围棋中?_Go_Deferred - Fatal编程技术网

Go 什么是';推迟';在围棋中?

Go 什么是';推迟';在围棋中?,go,deferred,Go,Deferred,golang的文件中说: 在计算DEREFER语句时,将计算DEREFER函数的参数 这使我困惑 问题:评估值是否表示该值已经已知?我只是不明白为什么两个例子打印的不同。这让我困惑 我有两个例子: //It prints 0. func deferA() { i := 0 defer fmt.Println(i) i++ return } //It prints 1. func deferB() { i := 0 def

golang的文件中说:

在计算DEREFER语句时,将计算DEREFER函数的参数

这使我困惑

问题:评估值是否表示该值已经已知?我只是不明白为什么两个例子打印的不同。这让我困惑

我有两个例子:

 //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
接受一个函数,因此
fmt.Println(i)
是一个函数,当对defer语句求值时,它的参数
i
求值为
0

defer func(){fmt.Println(i)}
func(){fmt.Println(i)}
不带参数,它是一个闭包,因此
i
不计算,而是由闭包关闭


您可以在

处了解有关闭包的更多信息,函数参数是经过计算的,而不是函数本身

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

在第二种情况下,没有要计算的参数。但函数包含来自外部函数的值。因此,它可以直接获得它的实际价值


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

哦,对不起。我犯了一个错误,忘记了它的参数。defer语句延迟函数的执行,直到周围的函数返回。延迟调用的参数会立即求值,但函数调用在周围函数返回之前不会执行。