Golang global variable、init()、main() 的初始順序

Effective Go中有提到有關於init()的說明,但是當global variable和main()一起出現的時候,這裡面並沒有著墨太多,所以我們在這邊也做了一個簡單的實驗吧!

init()

筆者在接觸到init()的時候,覺得和Java的建構子(constructor)有點類似,但是Go的init()又能夠在同一個package、不同的file裡面都擁有init()宣告。(下面會以main package做舉例)

init()也能夠在package初始化的時候,替你把需要初始化好的變數狀態準備好,例如:DB connection package。
透過init(),我們就能夠在DB package被引入的時候,預先建立需要的變數,或是先準備好連線的狀態!

main()

main()當然就不用多說了,他是程式執行的進入點,肯定是大家最常見的一個宣告。
但是,當main()和init()一起使用的時候,究竟是誰會先被執行到呢?
那如果這時候我們需要用到全域變數(global variable)時,執行的順序是什麼呢?

init() VS. main() VS. global variable

不說廢話,直接用code實驗吧!Go Playground

package main

import (
"fmt"
)

var number = GetNumber()

func GetNumber() int {
    //fmt.Println("Number:", number) //Why this error?
    fmt.Println("GetNumber() is called")
    return 999
}

func init() {
    number = 0
}

func main() {
    if number == 0 {
        fmt.Println("yo~ this is main()")
    }
}

結論

執行順序:global variable -> init() -> main()

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s