关于Golang的闭包问题

关于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是不是有类似函数实例的概念?
上面这两种闭包的行为编译器会怎么解释?

查看回复