-
Notifications
You must be signed in to change notification settings - Fork 8
20180419_init func in golang
CI edited this page Aug 29, 2018
·
5 revisions
title: "Go 語言的 init 函式" date: 2018-04-19 type: blog author: AppleBoy link: https://blog.wu-boy.com/2018/04/init-func-in-golang/ layout: post comments: true
本篇會帶大家認識 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。假設要讀取 lib/pq 內的 init,一定要使用
import( // Needed for the Postgresql driver _ "github.com/lib/pq )
如果沒有加上 _
,當編譯的時候就會報錯,原因就是 main 主程式內沒有用到 pq 內任何非 init() 的功能,所以不可編譯成功。如果有多個 package 的 init 需要同時引入,這邊也是會依照 import 的順序來讀取。
大家一定很好奇 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 時都會被執行。
<iframe width="560" height="315" src="https://www.youtube.com/embed/WXMUWMsRTjQ" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>Go 語言線上課程目前特價 $1600,持續錄製中,每週都會有新的影片上架,歡迎大家參考看看,請點選底下購買連結:
-
Go 語言的錯誤訊息處理 (0)
-
Golang 套件管理工具 Glide (2)
-
在 AWS Lambda 上寫 Go 語言搭配 API Gateway (3)
-
Go 語言內 struct methods 該使用 pointer 或 value 傳值? (1)
-
用 Golang 寫 Command line 工具 (1)
-
Go 語言框架 Gin 終於發佈 v1.2 版本 (2)
-
Go 語言官方推出的 dep 使用心得 (6)
-
如何在 Go 專案內寫測試 (0)
-
新的 code coverage 線上服務 codecov.io (0)
-
用 Docker Multi-Stage 編譯出 Go 語言最小 Image (1)