Go 語言的 init 函式

本篇會帶大家認識 Go 語言的 init 函式,在了解 init func 之前,大家應該都知道在同一個 Package 底下是不可以有重複的變數或者是函式名稱,但是唯獨 init() 可以在同一個 package 內宣告多次都沒問題。看下面的例子,可以發現的是不管宣告多少次,都會依序從最初宣告到最後宣告依序執行下來。

package main

import (
    "fmt"
)

func init() {
    fmt.Println("init 1")
}

func init() {
    fmt.Println("init 2")
}

func main() {
    fmt.Println("Hello, playground")
}

從其他 package 讀取 init func

有下面這麽一種狀況,主程式需要單獨讀取 package 內的 init func 而不讀取額外的變數,這時候就要透過 _ 來讀取 package。假設要讀取 lib/pq 內的 init,一定要使用 _

import(
    // Needed for the Postgresql driver
    _ "github.com/lib/pq
)

如果沒有加上 _,當編譯的時候就會報錯,原因就是 main 主程式內沒有用到 pq 內任何非 init() 的功能,所以不可編譯成功。如果有多個 package 的 init 需要同時引入,這邊也是會依照 import 的順序來讀取。

init 執行時機

大家一定很好奇 init 的執行時間是什麼時候,底下舉個例子

var global = convert()

func convert() int {
    return 100
}

func init() {
    global = 0
}

func main() {
    fmt.Println("global is", global)
}

或者是把 init() 放到最上面

func init() {
    global = 0
}

var global = convert()

func convert() int {
    return 100
}

func main() {
    fmt.Println("global is", global)
}

兩種結果都是 0,這邊大家就可以知,init 執行的時機會是在執行 main func 之前,所以不管前面做了哪些事情,都不會影響 init 的執行結果。最後提醒大家,只要 package 內有 init 的 func,在引入 package 時都會被執行。

線上影片

https://www.youtube.com/watch?v=WXMUWMsRTj...


Go 語言線上課程目前特價 $1600 (新台幣),持續錄製中,每週都會有新的影片上架,歡迎大家參考看看,請點選底下購買連結:

點我購買

原文來自:『Go 語言的 init 函式

讨论数量: 4
appleboy

@zhouzhou $1600 新台幣,換算人民幣應該不用 400 喔,可以參考看看。

5年前 评论
yybawang

@appleboy 我知道你,你是开发 drone 的哈哈,当时用 drone 老是看到你

5年前 评论
appleboy

@yybawang 感謝支持,目前在台灣都在推廣 Drone,希望中國能更多人使用 drone

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!