私有数据:闭包可以捕获函数内部的数据,并且对外部不可见。这是一种创建私有数据的方法(保证局部变量的安全性)通过闭包既没有暴露CallNum这个变量,又实现了为函数计数的目的。
闭包
package main
import (
"fmt"
)
func main() {
accumulator := SomeFunc() //使用accumulator变量接收一个闭包
// 累加计数并打印
fmt.Println("The first call CallNum is ", accumulator()) //运行结果为:The first call CallNum is 1
// 累加计数并打印
fmt.Println("The second call CallNum is ", accumulator()) //运行结果为:The second call CallNum is 2
}
func SomeFunc() func() int { // 创建一个函数,返回一个闭包,闭包每次调用函数会对函数内部变量进行累加
var CallNum = 0 //函数调用次数,系函数内部变量,外部无法访问,仅当函数被调用时进行累加
return func() int { // 返回一个闭包
CallNum++ //对value进行累加
//实现函数具体逻辑
return CallNum // 返回内部变量value的值
}
}
The first call CallNum is 1
The second call CallNum is 2
回调
package main
import "fmt"
type Callback func(x, y int) int
// 提供一个接口,让外部去实现
func test1(x, y int, callback Callback) int {
return callback(x, y)
}
// 回调函数的具体实现
func calculationXOR(x, y int) int {
return x ^ y
}
func calculationAND(x, y int) int {
return x & y
}
// 回调函数的具体实现
func main() {
fmt.Println(test1(2, 3, calculationXOR)) //这样调用test1就能实现异或 以及 与的运算
fmt.Println(test1(2, 3, calculationAND))
}
1
2
package main
import "fmt"
func main() {
x, y := 1, 2
defer func(a int) {
fmt.Printf("x:%d,y:%d\n", a, y)
}(x) // 复制 x 的值
x += 100
y += 100
}
// y 为闭包引用,最终结果为x:1,y:102