GO高阶函数:匿名函数、回调函数和闭包

本文深入探讨了Go语言中的高阶函数概念,包括匿名函数、回调函数和闭包的使用场景及实现方式。通过具体示例展示了如何利用闭包进行计数器设计和文件名生成,以及回调函数在排序函数中的应用。

基本概念

高阶函数包括回调函数和闭包,二者区别如下:

  • 回调函数:接受一个或多个函数作为输入
  • 闭包:返回一个函数

匿名函数

go的高阶函数和python的有点不一样,go函数不能嵌套命名函数,所以go的高阶函数只能用匿名函数来实现。
Go中所有匿名函数都是闭包。匿名函数顾名思义即没有函数名的函数,一般用于模拟块级作用域,避免数据污染。例如:

package main

import (
   "fmt"
)

func main() {
   f:=func(){
      fmt.Println("hello world")
   }
   f()//hello world
   fmt.Printf("%T\n", f) //打印 func()
}

匿名函数不需要先定义再使用,可以直接使用:

package main

import (  
    "fmt"
)

func main() {
	func(arg string) {
		fmt.Println("this is a", arg)
	}("test")
	// "this is a test"
}

上面定义了一个形参为arg的匿名函数,并向函数中输入字符串"test"

回调函数

概念

函数的参数包含其他函数。回调函数可以使外函数的功能不那么单一。

使用场景

比较典型的应用是sort包中的SliceSTable()这个排序函数:

func SliceStable(slice interface{}, less func(i, j int) bool)

通过定义SliceStable函数中的less函数可以对数组数据按照不同的方式来排序。

package main

import (
	"fmt"
	"sort"
)

func main() {
	s := []int{61903}
    // 定义排序函数
	less := func(i, j int) bool {
		return s1[i] > s1[j]   // 降序排序
        // return s1[i] < s1[j]  // 升序排列
	}
    //
	sort.SliceStable(s1, less)
	fmt.Println(s1)
}

闭包(Closure)

闭包就是返回函数的函数,将函数作为函数的返回值。
使用方式是先实现闭包对象(闭包生成对象是函数),再通过这个函数做其他的功能。

demo1
生成一个counter计数器

package main

import "fmt"

func main() {
    a := counter()
    b:=a(1)
    c:=a(1)
    fmt.Println(b)  // 1
    fmt.Println(c)  // 2
}
func counter() func(int) int {
    a := 0
    return func(add int) int {
        a += add
        return  a
    }
}

demo2:
例如我现在有100个用户,每个用户都需要生成对应的xlsx文件、json文件、txt文件用于保存相关的信息,可以先创建闭包来实现三个函数,这三个函数可以生成.xlsx, .json, .txt的文件后缀,然后再通过这三个函数创建这100个用户的对应文件。

func MakeFile(suffix string) func(string) string {
    return func(clientName string) string {
        if !strings.HasSuffix(name, suffix) {
            return clientName + suffix
        }
        return clientName
    }
}
makeXlsx := MakeFile(".xlsx")
makeJson := MakeFile(".json")
makeTxt := MakeFile(".txt")

makeXlsx("clientA")
makeJson("clientA")
......

闭包应用场景:

  • 一般用于多个函数中有大量重复代码的情况
  • 或者用于工厂模式,需要根据不同的需求来实现不同的函数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值