go学习第二棒I青训营

69 阅读3分钟

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用处就很大。