一、golanginit是什麼
golanginit是Go語言中一個很變態的初始化函數,它是Go語言代碼裏面的一個特殊函數(如init()函數),在代碼加載時執行,無論我們有沒有在程序中直接使用這個函數。在程序啟動時,先執行依賴包的init()函數;再按照包的引用順序去執行本包中的init()函數;最後執行main函數。需要注意的是:init()函數在代碼加載時僅執行一次。
下面是使用golanginit的例子:
< package main
import "fmt"
func init() {
fmt.Println("golanginit")
}
func main() {
fmt.Println("Hello World!")
}
>
以上代碼輸出的結果是:
golanginit
Hello World!
二、golanginit的用處
1、對於需要初始化的變量,可以在init函數中完成初始化。因為init函數在變量聲明之後執行。
示例:
< package main
import "fmt"
var name string
func init() {
name = "GoLangInit"
}
func main() {
fmt.Println("Hello " + name + "!")
}
>
以上代碼輸出的結果是:
Hello GoLangInit!
2、在init函數中創建goroutine,可以實現服務的後台運行。
示例:
< package main
import (
"fmt"
"time"
)
func init() {
go func() {
for {
fmt.Println("GoLangInit is running...")
time.Sleep(time.Second * 5)
}
}()
}
func main() {
fmt.Println("Hello World!")
}
>
3、在init函數中可以進行死循環的操作,比如進行一些服務的初始化、資源準備等操作。
示例:
< package main
import (
"fmt"
"net/http"
)
func init() {
go func() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
fmt.Println("GoLangInit is running...")
http.ListenAndServe(":8888", nil)
}()
}
func main() {
fmt.Println("Starting GoLang Server...")
fmt.Println("Hello World!")
}
>
以上代碼監聽在本地8888端口並輸出GoLangInit is running,通過訪問http://localhost:8888可以看到輸出Hello World!。
三、golanginit注意事項
1、不同包的init方法在import時按照聲明的順序執行。
示例:
< package main
import (
"First"
"Second"
)
func main() {
fmt.Println("Hello World!")
}
>
package First
import "fmt"
func init() {
fmt.Println("First init...")
}
package Second
import "fmt"
func init() {
fmt.Println("Second init...")
}
以上代碼輸出的結果是:
First init...
Second init...
Hello World!
2、同一個包中的init函數執行順序是按照init函數的聲明順序執行。
示例:
< package main
import (
"fmt"
)
func init() {
fmt.Println("init 1")
}
func init() {
fmt.Println("init 2")
}
func init() {
fmt.Println("init 3")
}
func main() {
fmt.Println("Hello World!")
}
>
以上代碼輸出的結果是:
init 1
init 2
init 3
Hello World!
3、init函數不接收任何參數,也沒有返回值。
4、多個包的init函數之間是互不影響的。
四、結語
本文詳細介紹了golanginit的作用、使用方式、注意事項等方面的內容,相信讀者已經掌握了golanginit的應用方法。在寫代碼過程中,善於利用init函數可以提高開發效率,減少無謂的代碼冗餘。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/297404.html