Golang init() 函式

25minutes發表於2021-09-09

如果❤️我的文章有幫助,歡迎點贊、關注。這是對我繼續技術創作最大的鼓勵。

Golang init() 函式

先舉個例子

圖片描述

init() 是什麼

Go 語言設計過程中保留了預設的兩個函式,分別是 main()init() 函式。

兩者的區別在於:

  • main() 函式只能使用於 main 包中,而且每個 main 包只能有 一個main() 函式
  • 但對於 init() 函式, 則能夠使用在所有的包中。而且一個程式(甚至一個檔案)中可以寫任意多個 init() 函式。

注意:一個程式(甚至一個檔案)中可以寫任意多個 init() 函式,但對於維護程式碼可讀性排查問題並沒有任何好處

init() 特點

  • init() 用於 程式執行前 的進行包初始化(自定義變數、例項化通訊連線)工作
  • 每個包每個程式檔案 可以同時擁有多個init(),但不建議
  • 同一個包、檔案中多個 init() 執行順序, Golang 中並未明確
  • 不同包的 init()執行順序,按照 匯入包的依賴關係 決定
  • init() 不能被其他函式呼叫,而自動 在main函式執行前 被呼叫

—— 參考來源於 [effective_go] golang.google.cn/doc/effective_go#init

init() 什麼時候執行

init() 函式 是 Golang 程式初始化 包含的一部分。

在 Golang 中程式的 初始化先於 main() 執行:具體由 runtime 初始化每個被匯入的包。

  • 初始化順序是按照解析的依賴關係的順序執行,沒有依賴的包最先初始化
  • 首先初始化的是 每個包作用域內的常量變數(其中:常量先於變數),之後執行包內 init()
  • 相同一個包、檔案可以同時擁有多個 init()。
  • init() 和 main() 一樣,沒有任何引數和返回值,不能夠被其他函式呼叫。
  • 同一個包、檔案 多個 init() 執行順序並未明確。

執行順序總結: import –> const –> var –> init() –> main()

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4328/viewspace-2797534/,如需轉載,請註明出處,否則將追究法律責任。

相關文章