关于Go的闭包实现有点疑惑,特来请教.先贴代码:
package main
import "fmt"
func main() {
// 测试一:
adderCountF1 := adderCount()
fmt.Println(adderCountF1(1)) // 0 += 1
fmt.Println(adderCountF1(2)) // 1 += 2
adderCountF2 := adderCount()
fmt.Println(adderCountF2(1)) // 0 += 1
fmt.Println(adderCountF2(2)) // 1 += 2
// 测试二:
var x int
func(max int) {
sum := 0
for i := 0; i < max; i++ {
sum += i
}
x = sum
}(100)
fmt.Println(x) // 4950
}
func adderCount() func(int) int {
var x int
return func(delta int) int {
x += delta
return x
}
}
以下是我的理解:
基于测试一,我认为闭包引用外部函数变量时是将外部变量的值在内部进行了拷贝
基于测试二,我发现内部变量与外部引用的是相同变量
问题:
以上两个测试我的理解互相矛盾.我猜测Golang是不是有类似函数实例的概念?
上面这两种闭包的行为编译器会怎么解释?
函数实例这个概念是类似于类的实例么?肯定的话,那么答案就是
是
.关于编译器的问题我不懂,闭包大概就是函数执行的内存包含了一个环境,期待大牛的解答。