init函數:
每個包可以包含任意多個 init 函數,這些函數都會在程式執行開始的時候被調用。所有被編譯器發現的 init 函數都會安排在 main 函數之前執行。 init 函數用在設定包、初始化變量或者其他要在程式運作前優先完成的引導工作。
比如:
package postgres
import (
"database/sql"
)
func init() {
sql.Register("postgres", new(PostgresDriver))
}
package main
import (
"database/sql"
_ "github.com/goinaction/code/chapter3/dbdriver/postgres"
)
func main() {
sql.Open("postgres", "mydb")
}
第一段代碼中,postgres會将自己的驅動注冊到sql包裡面去。是以在第二段代碼中可以直接用sql打開postgres資料庫。
import中導入_ "github.com/goinaction/code/chapter3/dbdriver/postgres"的意義就是:這個庫在我的代碼裡面用不到,但是我依然要導入,導入的時候會先運作該庫的init函數将自己的驅動注冊到sql包中。是以在前面加上下劃線。