标签:Go语言 cal 网上 编译器 print 时空 ola ima Nging
init()函数会在每个包完成初始化后自动执行,并且执行优先级比main函数高。init 函数通常被用来:
为了使用导入的包,首先必须将其初始化。初始化总是以单线程执行,并且按照包的依赖关系顺序执行。这通过Golang的运行时系统控制,如下图所示:
mainTest
文件:
package main
import (
"fmt"
"thisInit"
)
func main() {
fmt.Println("main")
thisInit.ATest()
}
func init(){
fmt.Println("init2")
}
func init(){
fmt.Println("init 1")
}
aatest
文件:
package thisInit
import "fmt"
func init() {
fmt.Println("aa test testInit2")
}
func init() {
fmt.Println("aa test testInit1")
}
atest
文件:
package thisInit
import "fmt"
func init() {
fmt.Println("a test testInit2")
}
func init() {
fmt.Println("a test testInit1")
}
func ATest() {
fmt.Println("A Test thisInit")
}
btest
文件:
package thisInit
import "fmt"
func init() {
fmt.Println("b test testInit2")
}
func init() {
fmt.Println("b test testInit1")
}
结论:多个 init 的 执行顺序,结果是按照 文件命名的 ascii 顺序 (字母顺序)来执行的。
建议:尽量 一个包 只写 一个 init函数。
官网上的说明:
To ensure reproducible initialization behavior, build systems are encouraged to present multiple files belonging to the same package in lexical file name order to a compiler.
为了确保可重复的初始化行为,构建系统被鼓励以词法文件名顺序向编译器呈现属于同一个包的多个文件。
package main
import "fmt"
func init(){
fmt.Println("init2")
}
func init(){
fmt.Println("init1")
}
func main(){
fmt.Println("main")
}
/*执行结果:
init2
init1
main */
同一个源文件内,可以有多个init()
函数,并且在执行时是按顺序执行的。
Go要求非常严格,不允许引用不使用的包。但是有时你引用包只是为了调用init函数去做一些初始化工作。此时空标识符(也就是下划线)的作用就是为了解决这个问题。
import _ "image/png"
标签:Go语言 cal 网上 编译器 print 时空 ola ima Nging
原文地址:https://www.cnblogs.com/l1ng14/p/13939232.html