作用
执行顺序
测试 同一个 Go 文件可以重复定义多个 init 方法
main.go
package main
import (
. "fmt"
)
// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
Println(1)
}
func init() {
Println(2)
}
func main() {}
go run main.go
1
2
2.1 测试同一个包中,不同的文件中的init执行顺序
pkg/a.go
package pkg
import . "fmt"
func init() {
Println("pkg-a")
}
pkg/b.go
package pkg
import . "fmt"
func init() {
Println("pkg-b")
}
pkg/pkg.go
package pkg
import . "fmt"
var Pkg = "pkg"
func init() {
Println("pkg-pkg")
}
main.go
package main
import (
. "fmt"
"init-demo/pkg"
)
// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
Println(1)
}
func init() {
Println(2)
}
func main() {
println(pkg.Pkg)
}
go run main.go
pkg-a
pkg-b
pkg-pkg
1
2
pkg
测试 导入不同的包有和没有依赖其他包的情况
pkg1/pkg.go
package pkg1
import "fmt"
var Pkg1 = "pkg1"
func init() {
fmt.Println("pkg1-pkg1")
}
pkg2/pkg.go
package pkg2
import "fmt"
import "init-demo/pkg3"
var Pkg2 = "pkg2"
func init() {
fmt.Println("pkg2-pkg2")
}
pkg3/pkg.go
package pkg3
import (
"fmt"
)
func init() {
fmt.Println("pkg3-pkg3")
}
main.go
package main
import (
. "fmt"
"init-demo/pkg1"
"init-demo/pkg2"
)
// 同一个go文件中的多个init方法,按照定义的顺序执行
func init() {
Println(1)
}
func init() {
Println(2)
}
func main() {
println(pkg1.Pkg1)
println(pkg2.Pkg2)
}
执行 $ go run main.go
输出
pkg1-pkg1
pkg3-pkg3
pkg2-pkg2
1
2
pkg1
pkg2
先执行pkg1的init,因为在main中被最先引入,优先按照import的顺序执行,接着是pkg3的init, 接着是pkg2的init
因为 pkg3被pkg2引用,这样pkg3的init优先于pkg2的init执行
最后是main包中的init和main函数的方法
import cycle not allowed