go语言---特殊类型的函数

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函数自动释放申请的资源。

猜你喜欢

转载自blog.csdn.net/qq_42708024/article/details/106908931