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。               

 

posted @ 2022-06-18 13:43  lalallalalal  阅读(768)  评论(0编辑  收藏  举报