在golang中init函数
是初始化函数,可以用来进行一些初始化操作。
每一个Go源文件都可以包含一个init函数
,该函数会在main函数
执行前被Go运行框架调用。
func init() {
// 代码块...
}
这种特殊的函数不接收任何参数也没有任何返回值,我们也不能在代码中主动调用它。
当程序启动的时候,init函数
会按照它们声明的顺序自动执行。
一个包的初始化过程是按照代码中引入的顺序来进行的,所有在该包中声明的init函数
都将被串行调用并且仅调用执行一次。每一个包初始化的时候都是先执行依赖的包中声明的init函数
再执行当前包声明的init函数
。确保在程序的main函数
开始执行时所有的依赖包都已初始化完成。
简单来说,Go中单个源文件执行顺序就是
// main.go
package main
import (
"fmt"
)
var num int = setNum() // first: 全部变量的定义
func setNum() int {
fmt.Println("main.go的setNum函数执行...")
return 10
}
func init() { // second: init函数的调用
fmt.Println("main.go的init函数执行...")
}
func main() { // third: main函数的调用
fmt.Println("main.go的main函数执行...")
}
// 执行结果:
/*
main.go的setNum函数执行...
main.go的init函数执行...
main.go的main函数执行...
*/
多个源文件都有init函数,执行流程:
// main.go
package main
import (
"fmt"
"golang-initFunction/initTest"
)
var num int = setNum() // first: 全部变量的定义
func setNum() int {
fmt.Println("main.go的setNum函数执行...")
return 10
}
func init() { // second: init函数的调用
fmt.Println("main.go的init函数执行...")
}
func main() { // third: main函数的调用
fmt.Println("main.go的main函数执行...")
println(initTest.Name)
}
// initTest.go
package initTest
import "fmt"
var Name, Gender, Age string
var num int = setNum()
func setNum() int {
fmt.Println("initTest.go的setNum函数执行...")
return 10
}
// 定义一个init函数对变量进行初始化赋值
func init() {
fmt.Println("initTest.go的init函数执行...")
Name = "August Rush"
Gender = "male"
Age = "22"
}
执行结果:
initTest.go的setNum函数执行...
initTest.go的init函数执行...
main.go的setNum函数执行...
main.go的init函数执行...
main.go的main函数执行...
姓名: August Rush 性别: male 年龄: 22
基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建