init函数
主要是完成初始化工作
init函数可以每个文件中进行定义,在执行期间,先执行init函数在执行main函数
注意
- 如果一个文件中同时包含全局变量,init函数,main函数,则执行的流程为全局变量的定义—>init函数—>main函数
匿名函数
Go语言支持匿名函数,如果某些函数我们只希望使用一次,可以考虑使用匿名函数。匿名函数也可以实现多次调用
匿名函数的使用
- 在定义匿名函数时,直接调用。这种函数只能使用一次
func main(){
//在定义的时候直接调用
res := func (n1,n2 int)int{
return n1 + n2
}(10,20) //直接传参调用
fmt.Println("res = ",res)
}
- 将匿名函数赋值给一个变量,在通过变量进行调用
a := func (n1,n2 int)int{
return n1 - n2
}
res := a(10,20)
fmt.Println("res = ",res)
我们将匿名函数赋值给一个函数变量,此时可以通过函数变量完成多次调用
- 全局匿名函数,将一个匿名函数赋值给全局变量,则该函数在文件中任何位置都能访问。
var (
Func1 = func (n1 int,n2 int)int {
return n1 + n2
}
)
res3 := Func1(10,20)
fmt.Println("res3 = ",res3)
defer函数
在函数中,经常会使用一些资源,例如(数据库,文件操作等),为了在函数执行结束之后,及时的释放资源,因此出现了defer函数,类似于C++中的智能指针。
函数特性:
- 当执行到defer修饰的语句的时候,会先将语句压入到栈中。
- 当函数结束以后,再从defer栈中依次弹出数据
func sum(n1 , n2 int) int {
defer fmt.Println("n1 = ",n1)
defer fmt.Println("n1 = ",n1)
res := n1 + n2
fmt.Println("res = ",res)
return res
}
先被压入栈的语句后执行,后被压入栈的语句先执行。
defer函数的优势:
我们再申请一些资源的时候,防止后面忘记释放,造成资源泄露,因此我们再申请资源之后,可以立即写defer函数,当函数运行结束以后,defer函数自动释放申请的资源。