标签搜索
MemoryCloud Blog

Go函数闭包特性

kennedy
2023-09-19 / 0 评论 / 20 阅读 / 正在检测是否收录...

期望有个函数每次调用一次的返回值的结果值都是增加一次之后的值

示例代码 抛出异常

var local int //全局变量
func myaotu() int {
    local += 1
    return local
}
func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(myaotu())
    }
}
1.被迫声明全局变量
2.全局变量不能轻易归零

既不要全局变量也要可以归零;

函数内定义函数,函数内部不能访问其他函数的局部变量,所以在内部定义函数访问外层函数局部变量

func myaotu() int {
    local := 0
    return func() int {
        local += 1 //访问另外一个函数(外)的局部变量
        return local
    }() //由于外层返回值是int,内层必须调用才能正常返回local
}

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(myaotu())
    }
}
1
1
1
1
1 //每次调用外层都会把local清零,内层再增加,所以不变

改进:

func myaotu() func() int {
    local := 0
    return func() int {
        local += 1
        return local
    }
}

func main() {
    nextfunc := myaotu()
    for i := 0; i < 5; i++ {
        fmt.Println(nextfunc())
    }
}
1
2
3
4
5
    nextfunc1 := myaotu() //从新引用时会清零
0

评论

博主关闭了所有页面的评论