go_闭包

介绍

闭包就是一个函数和与其相关的引用环境组合的一个整体(实体)。

闭包是一种特殊类型的匿名函数,它引用在函数本身之外声明的变量是匿名函数与匿名函数所引用环境的组合

不仅仅是存储了一个函数的返回值,它同时存储了一个闭包的状态。

案例演示:

package  main
import (
	"fmt"
)


//累加器
func AddUpper() func (int) int{
	var n int =10
	return func (x int)int{
		n += x
		return n
	}
}

func main(){

	//使用前面的代码
	f := AddUpper()
	fmt.Println(f(1))  //11
	fmt.Println(f(2))  //13
	fmt.Println(f(3))  //16
	
}

对上面代码的说明和总结:

1)AddUpper是一个函数,返回的数据类型是 func (int)int

2)闭包的说明

         返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。

3)大家可以这样理解:闭包是类,函数是操作,n是字段。函数和它使用到n构成闭包。

4)当我们反复的调用f函数时,因为n是初始化一次,因此每调用一次就进行累加。

5)我们要搞清楚闭包的关键,就是要分析出返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。

6)对上面代码的修改,

package  main
import (
	"fmt"
)


//累加器
func AddUpper() func (int) int{
	var n int =10
	var str ="hello"
	return func (x int)int{
		n += x
		str += string(36)  //36对应的ASCII值为 $
		fmt.Println(str)  // "hello$"  "hello$$"	 "hello$$$"
		return n
	}
}

func main(){

	//使用前面的代码
	f := AddUpper()
	fmt.Println(f(1))  //11
	fmt.Println(f(2))  //13
	fmt.Println(f(3))  //16
	
}

 闭包的实践:

请编写一个程序,具体要求如下:

1)编写一个函数makeSuffix(suffix string)可以接收一个文件后缀名(比如:.jpg),并返回一个闭包。

2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg),则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名。

3)要求使用闭包的方式完成 

4)strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。

代码如下:

package  main
import (
	"fmt"
	"strings"
)


// 1)编写一个函数makeSuffix(suffix string)可以接收一个文件后缀名(比如:.jpg),并返回一个闭包。
// 2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg),则返回文件名.jpg,如果已经有.jpg后缀,则返回原文件名。
// 3)要求使用闭包的方式完成
// 4)strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀。

func makeSuffix(suffix string) func (string) string {
	//如果name没有指定的后缀,则加上,否则就返回原来的名字
	return func (name string)string{
		if !strings.HasSuffix(name,suffix){
		return name + suffix
	    }
	    return name
	}
}

func main(){

	f1 := makeSuffix(".jpg")
	fmt.Println("文件名称为:",f1("lean.txt"))   //lean.txt.jpg
	fmt.Println("文件名称为:",f1("lean"))   	 //lean.jpg
	fmt.Println("文件名称为:",f1("keil.jpg"))   //keil.jpg
	
}

代码说明:

1)返回的匿名函数和makeSuffix(suffix string)的suffix变量组合成一个闭包,因为返回的函数引用到suffix这个变量。

2)我们体会一下闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg;而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。 

参考资料来源于:尚硅谷

深入理解可参考:Go语言之闭包_go 语言 闭包_Sheena爽的博客-CSDN博客

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值