日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Go中init()執(zhí)行順序詳解_Golang

作者:FeelTouch?Labs ? 更新時(shí)間: 2022-11-08 編程語言

概述

init()一般用來做一些初始化工作, go允許定義多個(gè)init(),根據(jù)init()重復(fù)場(chǎng)景不同,可以分為

  • 同文件 單文件中定義多個(gè)init()
  • 同模塊 同模塊下不同文件中定義了多個(gè)init()
  • 子模塊 本模塊和子模塊都包含init()
  • 跨模塊 多個(gè)被引用模塊中均含init()

要點(diǎn)秘訣:

  • 涉及引用時(shí),先加載的先執(zhí)行
  • 同一文件中,先定義的先執(zhí)行

init()函數(shù)

init()函數(shù)沒有參數(shù),也沒有返回值。

init()函數(shù)在程序運(yùn)行時(shí),自動(dòng)自動(dòng)被調(diào)用執(zhí)行,不能在代碼中主動(dòng)調(diào)用它。

init()函數(shù)執(zhí)行順序和時(shí)機(jī) 執(zhí)行順序

先看一段執(zhí)行代碼:

package main
 
import "fmt"
 
var x int8 = 5
 
const name = "Vitalik"
 
func init() {
	fmt.Println(x)
}
func main() {
	fmt.Println("Eth merge")
}

輸出結(jié)果:

5
Eth merge
Exiting.

可見就目前三者來講順序如下:

全局變量?->?init() -> main()

執(zhí)行時(shí)機(jī)

Go語言程序啟動(dòng)會(huì)先從main包檢查其導(dǎo)入的所有包 ,每個(gè)包又可能導(dǎo)入了其他的包,由此Go編譯器由此構(gòu)建出一個(gè)樹狀的包引用關(guān)系,再根據(jù)引用順序決定編譯順序,依次編譯這些包的代碼。

具體:

1. main引用的同級(jí)包,按引用順序依次編譯

2.包中再引用包,最底層的葉子節(jié)點(diǎn)的init()先編譯,依次往上調(diào)用

即,在運(yùn)行啟動(dòng)時(shí),最后導(dǎo)入的包會(huì)最先初始化并調(diào)用其init()函數(shù),

原文鏈接:https://blog.csdn.net/feeltouch/article/details/126869416

欄目分類
最近更新