init函数作用
- 执行Go语言的sync.Once操作;
- 有些不能使用初始化表达式的变量,可以在init函数中初始化;
- 先于普通函数执行一些操作。
init函数特点
- init函数是先于main函数执行;
package main
import "fmt"
func init() {
fmt.Println("init...")
}
func main() {
fmt.Println("main...")
}
输出:
init...
main...
- init函数没有入参;
package main
func init(n int) {
n += 3
}
func main() {
}
$ go run InitParameter.go
# command-line-arguments
.\InitParameter.go:3:6: func init must have no arguments and no return values
- init函数没有返回值;
package main
func init() {
return 3
}
func main() {
}
输出
$ go run InitReturn.go
# command-line-arguments
.\InitReturn.go:4:2: too many arguments to return
have (number)
want ()
- init函数也不能被显示调用;
package main
import "fmt"
func init() {
fmt.Println("nothing")
}
func main() {
init()
}
输出
$ go run CallInit.go
# command-line-arguments
.\CallInit.go:9:2: undefined: init
- 不通报的init函数,按照引入的顺序来执行;
- 每个包有可以有多个init函数,但不能保证他们之间的启动顺序;
- 每个文件有可以有多个init函数,他们按照定义的先后顺序来执行;
package main
import (
"fmt"
)
func init() {
fmt.Println("init3...")
}
func init() {
fmt.Println("init1...")
}
func init() {
fmt.Println("init2...")
}
func main() {
}
输出
$ go run InitSigleFile.go
init3...
init1...
init2...