Go日常食用之闭包的基础用法|Go主题月

368 阅读2分钟

前言

闭包这个名词大家应该都听说过,特别是对于写过前端的小伙伴们,那么到底什么是闭包呢?在维基百科中的定义是这样说明的:

在计算机科学中,闭包,又称词法闭包或函数闭包,是在支持头等函数的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数和一个关联的环境。环境里是若干对符号和值的对应关系,它既要包括约束变量,也要包括自由变量,有些函数也可能没有自由变量。

那么本次我们就来一起探索一下go语言中的闭包基础用法。

定义

在go语言中闭包是如何使用的呢?一个简单的示例:

func AppendSign(sign string) func(c string) string {
	return func(c string) string {
		return c + sign
	}
}

上述代码中,调用AppendSign会返回一个func(c string) string{}的匿名函数(实际上是返回的此匿名函数的地址),然后调其返回的匿名函数,则会将传入AppendSign的签名附带在其后返回回来,实际调用运行为:

func main() {
	s := AppendSign(" - From JueJin")
	fmt.Println(s("Golang"))
	fmt.Println(s("Java"))
	fmt.Println(s("Python"))
}

输出结果:

Golang - From JueJin
Java - From JueJin
Python - From JueJin

当然,你还可以返回多个闭包,例如:

func AppendManySign(sign string, sing2 string) (f1 func(c string) string, f2 func(c string) string) {
	f1 = func(c string) string {
		return c + sign
	}
	f2 = func(c string) string {
		return c + sing2
	}
	return
}

func main() {
	f1, f2 := AppendManySign(" - From JueJin", " - From 掘金")
	fmt.Println(f1("Golang"))
	fmt.Println(f2("Golang"))
}

输出结果:

Golang - From JueJin
Golang - From 掘金

后记

在实际的开发中,会有很多地方用到闭包,例如模块开发中有些业务需要异步等待调用,则可以直接返回闭包供给调用方控制。

最后,感谢您的阅读,谢谢!