init函数介绍
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被go运行框架调用,也就是说init会在main函数前被调用。
使用细节:
如果一个文件同时包含全局变量定义,init函数和main函数,则执行的流程是:变量定义->init函数->main函数
如图:
接着我们在引入包时,如果main.go和utils.go都含有变量定义和init函数时,执行流程会是这样:如图
main.go utils.go
import ("utils.go文件") 变量定义【执行1】
变量定义【执行3】 init函数【执行2】
init函数【执行4】
main函数【执行5】
匿名函数
介绍
go支持匿名函数,如果我们某个函数只是希望使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用。
匿名函数使用方式1
在定义匿名函数时直接调用,这种方式匿名函数只能调用一次
匿名函数使用方式2
将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
全局匿名函数
如果将匿名函数赋给一个全局变量,那么这个匿名函数就成为一个全局匿名函数
闭包
闭包就是一个函数和与其相关的引用环境组合的一个整体。
实例:
对上述代码说明:
1) AddUpper 是一个函数,返回的数据类型是 func (int) int
2) 返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包。
3)当我们反复的调用这个f函数时,因为n是初始化一次,因此每调用一次就进行累计。
4)闭包的关键就是要知道返回的函数它使用(引用)到哪些变量,因为函数和它引用到的变量共同构成闭包。
闭包实践
编写一个程序,具体要求如下
1) 编写一个函数 makeSuffix(suffix string)可以接受一个文件后缀名(比如.jpg),并返回一个闭包
2)调用闭包,可以传入一个文件名,如果该文件名没有指定的后缀(比如.jpg),则返回文件名.jpg,如果已经有.jpg,如果已经.jpg后缀,则返回原文件名。
3)要求使用闭包的方式完成
4)strings.HasSuffix,该函数可以判断某个字符串是否有指定的后缀名。
代码说明:
1)返回的匿名函数和makeSuffix(suffix string)的suffix的变量组合成一个闭包,因为返回的函数引用到suffix这个变量
2)闭包的好处,如果使用传统的方法,也可以轻松实现这个功能,但是传统方法需要每次都传入后缀名,比如.jpg,而闭包因为可以保留上次引用的某个值,所以我们传入一次就可以反复使用。