go编程技巧(闭包&回调)

53 阅读1分钟

私有数据:闭包可以捕获函数内部的数据,并且对外部不可见。这是一种创建私有数据的方法(保证局部变量的安全性)通过闭包既没有暴露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