Go 什么是';推迟';在围棋中?
golang的文件中说: 在计算DEREFER语句时,将计算DEREFER函数的参数 这使我困惑 问题:评估值是否表示该值已经已知?我只是不明白为什么两个例子打印的不同。这让我困惑 我有两个例子: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
//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语句延迟函数的执行,直到周围的函数返回。延迟调用的参数会立即求值,但函数调用在周围函数返回之前不会执行。