淺談Go中的init()

1. init()函數

init()函數會在包被初始化後自動執行,並且在main()函數之前執行,但是需要注意的是init()以及main()函數都是無法被顯式調用的,如下圖:
在這裏插入圖片描述運行報錯如下:
在這裏插入圖片描述

2. 執行順序

那麼init()是不是最先執行的呢? 答案是否定的,首先,在他之前會進行全局變量的初始化;如下代碼:
main.go:

package main

import (
	"fmt"
	"chapter02/utils"
) 

var  variate  int = 3
func init(){
	fmt.Println("main init3....")
}

func init(){
	fmt.Printf("main全局變量初始化:%d\n",variate)
	fmt.Println("main init.....")
	
}

func init(){
	fmt.Println("main init2....")
}

func main(){
	fmt.Println("main  main.....")
	utils.Print()
}

utils.go

package utils

import "fmt"

var A int = 3



func init(){
	fmt.Println("utils A: ",A)
	fmt.Println("utils  init....")
}

func init(){
	fmt.Println("utils init2....")
}

func Print(){
	fmt.Println("utils  print....")
}

輸出如下:

utils A:  3
utils  init....
utils init2....
main init3....
main全局變量初始化:3
main init.....
main init2....
main  main.....
utils  print....

分析

根據上述代碼以及輸出來看,我們不難看出,當我們導入其他包時,會先初始化導入的包,而初始化包時,會先加載全局變量,而後從上到下加載init()函數,當被導入的包的init()函數執行完畢後,執行調用方的全局變量加載,init()函數的順序加載,之後執行main()函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章