1.Init函数 每一个源文件都可以包含一个init函数,该函数会在main函数执行前被go运行框架调用,也就是说init会在main函数前被调用。
l如果一个文件同时包含变量定义,init函数和main函数,则执行的流程是变量定义->init函数->main函数 lInit函数最主要的作用就是完成初始化的工作
2.匿名函数 匿名函数使用方式 l在定义匿名函数时就直接调用,这种方式匿名函数只能调用一次 l将匿名函数赋给一个变量(函数变量),再通过该变量来调用匿名函数
全局匿名函数:如果将匿名函数赋给一个全局变量,那么这个匿名函数就将成为一个全局匿名函数,可以在程序有效
3.闭包
闭包就是一个函数和与其他相关的引用环境组合的一个整体(实体)
实例:package main
import "fmt"
//累加器
func AddUpper() func(int) int {
var n int = 10
return func(x int) int {
n = 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是一个函数,返回的数据类型是fun(int)int
2)闭包说明:var n int = 10return func(x int) int { n = n + x return n2)返回的是一个匿名函数,但是这个匿名函数引用到函数外的n,因此这个匿名函数就和n形成一个整体,构成闭包
3)理解:闭包是类,函数是操作,n是字段,函数和它使用到的n构成闭包。
4)当我们反复调用f函数时,因为n时初始化一次,因此每调用一次就进行累计
4.Defer
在函数中,程序员经常需要创建资源,为了在函数执行完毕后,及时释放资源,go的设计者提供defer(演示机制)
l当执行到defer时,暂时不执行,会将defer后面的语句压入栈中,当函数执行完毕后,再从defer栈中按照先入后出的方式出栈执行
l在defer将语句放入到栈中时,会将相关值拷贝同时入栈
实例:func sum(n1, n2 int) int {
defer fmt.Println(n1)
defer fmt.Println(n2)
n1++
n2++
res := n1 + n2
fmt.Println("sum:", res)
return res
}
func main() {
res := sum(10, 20)
fmt.Println("main:", res)
}
输出:
sum: 32
20
10
main: 32
1)在goland编程中的通常做法是:创建资源后,比如打开文件获取了数据库的链接,或者是锁资源,可以执行defer file.Close() defer connect.Close()
2)在defer后,可以继续使用创建资源3)当函数完毕后,系统会依次从defer栈中,取出语句,关闭资源
心得体会:init函数在go中和Python中用法不一样,但是个人觉得go中的功能更强大。还有Python中的匿名函数大多用lambda,go的局限就比较小。defer功能也比较强大,在做项目上,有时候不知道什么时候关闭文件,defer用处就很大。