Go之导入包、init函数、全局变量和main()函数的执行顺序
此文是学习了韩顺平老师的视频之后总结的,方便以后自己查阅,如有不对,请指出批评。
1.每一个源文件都可以包含一个init函数,该函数会在init函数执行之前被Go框架调用,也就是说init函数在main函数执行前被调用。
因此可以使用init函数进行一些初始化的工作。
1 func init() { 2 fmt.Println("我先来的哦init") 3 } 4 5 func main() { 6 fmt.Println("我居然是老二") 7 }
结果为:
我先来的哦init
我居然是老二
2.但是如果一个文件包含全局变量,init函数和main函数,它的执行流程是:定义全局变量-->init函数-->main函数。
import "fmt" var first=test() func test(){ fmt.Println("我才是真正的老大first") } func init() { fmt.Println("我变成老二了,呜呜呜init") } func main() { fmt.Println("原本以为在谷底了,怎么走都是向上,没想到啊") }
结果为:
我才是真正的老大first
我变成老二了,呜呜呜init
原本以为在谷底了,怎么走都是向上,没想到啊main 1
3.如果导入了本地包,则会先执行导入包的变量和init函数
1 package main 2 3 import ( 4 "fmt" 5 "main/demo1" 6 ) 7 8 var first = test() 9 10 func test() int { 11 fmt.Println("唔啊啊,这是怎么回事啊,test()") 12 return 1 13 } 14 15 func init() { 16 fmt.Println("怎么会这样,我怎么变成老三了,呜呜呜init") 17 } 18 19 func main() { 20 fmt.Println("累了,毁灭吧main", first) 21 fmt.Println("Age=", demo1.Age, "Name=", demo1.Name)
1 package demo1 2 3 import "fmt" 4 5 var Age int 6 var Name string 7 8 //Age和Name全局变量需要在main.go中使用, 9 //但是我们先要初始化这两个变量的值 10 11 //init完成初始化工作 12 func init() { 13 fmt.Println("没想到吧,你们得意的太早的,demo1的init") 14 Age = 100 15 Name = "lalalalala" 16 }
上述的main包和demo1在同一个目录下,直接导入即可,执行结果是:
1 没想到吧,你们得意的太早的,哈哈哈哈,demo1的init。 2 唔啊啊,这是怎么回事啊,我怎么成老二了,全局变量first得到test()函数的结果。 3 怎么会这样,我怎么变成老三了,呜呜呜init。 4 累了,毁灭吧main 1 。 5 Age= 100 Name= lalalalala。