13-匿名函数和闭包

110 阅读2分钟

匿名函数

  • 匿名函数就是没有函数名的函数,匿名函数多用于回调函数闭包
  • 格式如下:
func(参数)(返回值){
    // 函数体
}

匿名函数常用格式

  • 立即执行可以类比js中的IIFE
**package main
import (
    "fmt"
)

func main() {
    // 1.匿名函数
    sayHello := func () {
        fmt.Println("say hello go")
    }
    sayHello()

    // 2. 立即执行函数
    func(a, b int) {
        fmt.Println(a + b)
    }(1, 2)
}

闭包

  • 闭包指的是一个函数和其相关的应用环境组合而成的实体;闭包=函数+引用环境
package main
import (
    "fmt"
    "strings"
)

func main() {
    test := say()
    test()// 相当于执行say函数中返回的匿名函数
    strFunc := makeSuffix("沫沫")
    str1 := strFunc("asdfadsgdsg沫沫")
    str2 := strFunc("asdfadsgdsg")
    fmt.Println(str1, str2)
    add, sub := calc(5)
    add(2)
    add(3)
    sub(1)
}

// 定义一个函数返回匿名函数,它的返回值是一个函数
func say() func(){
    name := "蒋小白"
    return func() {
        fmt.Println("hello", name)
    }
}

func makeSuffix(suffix string) func(string) string {
    return func(name string) string {
        if !strings.HasSuffix(name, suffix) {// 后缀
            return name + suffix
        }
        return name
    }
}

func calc(base int) (func(int) int, func(int) int) {
    add := func(i int) int {
        base += i
        return base
    }
    sub := func(i int) int {
        base -= i
        return base
    }
    return add, sub
}

image.png

内置行数

  • close: 用来关闭channel
  • len: 用来求长度 string, array, slice, map, channel
  • new: 用来分配内存,主要用来分配值类型,比如int, struct, 返回的是指针
  • make: 用来分配内存,主要用来分配引用类型, chan,map,slice
  • append: 用来追加元素到slice中
  • panic和 recover: 用来错误处理
    • panic: 可以在任何地方引发
    • recover: 只在defer调用的函数中有效 (回复执行状态,收集错误日志)
package main
import (
    "fmt"
)

func main() {
    a()
    b()
    c()
}

func a() {
    fmt.Println("func a")
}
func b() {
    // 执行的时候加入到栈里面去了,最后函数执行完的时候执行
    defer func() {
        err := recover()
        if err != nil {
            // 记录日志
            fmt.Println("func b is error")
        }
    }()
    panic("panic in b")
    fmt.Println("func b")// 这句不执行,在panic的时候阻断后续的执行了
}
func c() {
    fmt.Println("func c")
}

image.png