go语言开发基础32 - 之go语言里的init函数

Go语言有一个特殊的函数init,先于main函数执行,实现包级别的一些初始化操作。

对于init 函数来说:每个包可以包含任意多个 init 函数,这些函数都会在程序执行开始的时候被调用。所有被编译器发现的 init 函数都会安排在 main 函数之前执行。init 函数用在设置包、初始化变量或其他要在程序运行前优先完成的引导工作。

init函数的主要作用:1)初始化不能采用初始化表达式初始化的变量。2)程序运行前的注册。3)实现sync.Once功能。 (备注:init函数没有输入参数、返回值。)

1.单个包中的init函数执行顺序

在Go语言中,执行顺序为:初始化变量--》init函数--》main函数,下面是具体示例:

package main

import "fmt"

func init() {
    fmt.Println("init main package...")
}
func main() {
    fmt.Println("in main function...")
}

/*
执行结果为:
    init main package...
    in main function... 
*/

通过上面的示例可以看出,init函数在main函数之前被执行。

2.单个包中有多个init函数的话,它们的执行顺序是不确定的

Go语言中,一个包文件和一个.go文件中可以实现多个init()函数,也不会编译出错。具体看下面示例:

package main

import (
    "fmt"
)

func init() {
    fmt.Println("init main package 1 ...")
}
func init() {
    fmt.Println("init main package 3 ...")
}
func init() {
    fmt.Println("init main package 2 ...")
}
func main() {
    fmt.Println("in main function...")
}

/*
执行结果:
    init main package 1 ...
    init main package 3 ...
    init main package 2 ...
    in main function...    
*/

通过上面的示例可以看出,一个包里可以包含多个init函数编译和执行都不会报错。init函数的执行顺序为init函数定义的顺序。

 

3. 相互依赖的包之间的init函数,按照递归的顺序执行

下面是相互依赖的项目之间的init函数的执行顺序。

(1)test包的内容为

package test

import "fmt"

func init() {
    fmt.Println("init test package ...")
}

func Test() {
    fmt.Println("in test function !!")
}

(2)main函数内容为

package main

import (
    "fmt"
    "go_dev/test"
)

func init() {
    fmt.Println("init main package ...")
}

func main() {
    test.Test()
    fmt.Println("in main function !!")
}

/*
执行结果为:
    init test package ...
    init main package ...
    in test function !!
    in main function !!
*/

从这个示例可以看出,main包里引用了另一个包时,在执行main函数之前会将引用包的init函数和main包里的init函数都先执行完后才会执行main函数里的代码。

 

posted @ 2020-07-18 15:28  欧-阳  阅读(365)  评论(0)    收藏  举报