复杂函数

上回说到,函数可以作为参数传递,函数也可以作为返回值,今天就来体验一下

参数为函数

func main() {
    test("张三", sayHello)
}

func sayHello(name string) {
    fmt.Println(name)
}

// 参数作为函数
func test(name string, f func(string)) {
    f(name)
}
GO

返回值为函数


func main() {
    f1 := cal("+")(1, 2)
    fmt.Println(f1)

    f2 := cal("-")(2, 1)
    fmt.Println(f2)
}

func add(a int, b int) int {
    return a + b
}

func sub(a int, b int) int {
    return a - b
}

func cal(oprator string) func(int, int) int {
    switch oprator {
    case "+":
        return add
    case "-":
        return sub
    default:
        return nil
    }
}
GO

匿名函数

func main() {
    result := func(a int, b int) int {
        return a + b
    }(1, 2)

    // 后面加括号代表直接调用,等价于 result(1,2)
    fmt.Println(result)
}
GO

闭包

简单来说,闭包就是在函数内部的函数,闭包 = 函数 + 引用环境

func main() {
    // 变量f接收了一个函数,是一个闭包,f在变量 f 的生命周期内,变量 x 也一直有效
    f := add()
    fmt.Println(f(10))
    fmt.Println(f(20))
    fmt.Println(f(30))
    fmt.Println("-----------")

    f1 := add()
    fmt.Println(f1(1))
    fmt.Println(f1(2))
    fmt.Println(f1(3))
}

// 返回一个函数
func add() func(int) int {
    var x int
    return func(y int) int {
        x += y
        return x
    }
}
GO

运行结果

10
30
60
-----------
1
3
6
GO

defer

类似finally,最后执行

defer特征

  • defer 注册延迟调用
  • 先 defer 的语句最后执行
func main() {
    fmt.Println("start")
    defer fmt.Println("1")
    defer fmt.Println("2")
    defer fmt.Println("3")
    fmt.Println("end")
    // 执行结果
    //  start
    //  end
    //  3
    //  2
    //  1
}
GO

init 函数

特征

  • init函数在main函数前自动执行,不能被别的方法调用
  • init函数没有参数,没有返回值
  • 每个包可以有多个init函数

// 加载顺序,变量初始化 => init => main
var i = initVar()

func init() {
    fmt.Println("init...")
}

func initVar() int {
    fmt.Println("initVar...")
    return 100
}

func main() {
    fmt.Println("main...")
}
GO

运行结果

initVar...
init...
main...
GO