持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
文章概览
- init函数
- 匿名函数
init函数
每一个源文件都可以有一个init函数,这个函数会在主函数执行前被电泳,这是由Go运行框架决定的。
示例
package main
import "fmt"
func init(){
fmt.Println("main init")
}
func main(){
fmt.Println("main")
}
示例2
package main
import "fmt"
var age = test()
func test() int{
fmt.Println("test")//1
return 11
}
func init(){
fmt.Println("init()")//2
}
func main() {
fmt.Println("main()...age=",age)
}
注意
- 全局变量最先被初始化
- 一般可以在init函数中完成初始化工作。
匿名函数
一个函数,假如只需要使用一次,那么匿名函数是不错的选择,在Go中支持匿名函数的使用,同时匿名函数也可以被多次调用。
匿名函数的使用方法1
可以在定义匿名函数的同时直接调用。
匿名函数的使用方式2
为了实现匿名函数的多次使用,可以把匿名函数赋值给变量,然后就可以通过这个变量来使用匿名函数。
全局匿名函数
假如把这个变量赋值给一个全局变量,那么匿名函数就拥有了全局变量的特性,可以在程序多个地方使用。
defer的基本使用
在函数中,程序员经常需要创建资源(比如数据库连接、文件句柄、锁定等),为了在函数执行完毕后,及时释放资源,就需要用到defer。
func test()(x int) {
x = 10
defer func() {
x++
}()
return x
}
注意
- 当go执行到一个defer时,不会立即执行defer后面的语句,而是将defer后的语句压入到一个栈中,然后继续执行下一个语句。
- 在函数执行完成后,从defer栈中将语句一次提取出来执行(从栈中取数据遵循先入后出的机制)。
- 将defer放入栈中时,会将defer语句的相关值一起拷贝到栈中。