闭包

闭包就是把别人写好的函数进行封装到自己函数中,有时候别人写的函数你需要引用但是部分函数的变量类型没法直接引用这时就需要闭包来处理

package main

import "fmt"
//例如这里是别人写好的函数
func intadd(x, y int) {
  fmt.Println(x + y)
}
//这就是闭包
func myadd(x func(int, int), a, b int) { //这里x是引用函数,函数类要写的和需要闭包函数类一致
  tmp := func() {
    x(a, b)
  }
  tmp()
}

func main() {
  myadd(intadd, 100, 300)
}

第二种写法

package main

import "fmt"

func adder() func(int) int {
  var x = 100
  return func(y int) int {
    x += y
    return y
  }
}

func main() {
  ret := adder()
  ret2 := ret(200)
  fmt.Println(ret2)
}

闭包底层原理

  1. 函数可以作为返回值
  2. 函数内部查找变量的顺序,现在自己内部找,找不到往外层找

闭包 = 函数 + 外部变量的引用

例子1

package main

import (
  "fmt"
  "strings"
)

func makeSuffixFunc(suffix string) func(string) string {
  return func(name string) string {
    if !strings.HasSuffix(name, suffix) { //这里判断文件后缀
      return name + suffix
    }
    return name
  }
}

func main() {
  jpgFunc := makeSuffixFunc(".jpg")
  txtFunc := makeSuffixFunc(".txt")

  fmt.Println(jpgFunc("test"))
  fmt.Println(jpgFunc("test.jpg"))
  fmt.Println(txtFunc("test"))
  fmt.Println(txtFunc("test.txt"))
}

执行结果

[Running] go run "g:\go\practice\bibao3\main.go"
test.jpg
test.jpg
test.txt
test.txt
posted @ 2023-02-08 20:57  suknna  阅读(26)  评论(0)    收藏  举报