首页 > 编程知识 正文

go语言的初始化函数

时间:2023-05-04 20:54:15 阅读:110737 作者:1208

go语言中的init函数用于初始化包,这是go语言的一个重要特性。

具有以下特点:

1 init函数用于在程序执行前初始化包,比如初始化包中的变量。

每个包可以有多个init函数。

package 3的每个源文件也可以有多个init函数。

4 go语言中没有明确定义同一个包中多个init函数的执行顺序。

5不同包的init函数根据包导入的依赖关系决定初始化函数的执行顺序。

init函数不能被其他函数调用,而是在main函数执行前自动调用。

下面的例子摘自《the way to go》。应用程序初始化时,操作系统的差异是隐藏的。

var prompt='输入一个数字,如3 ' '或%s退出。'

函数初始化(){

如果运行时。GOOS=='windows' {

提示=fmt。Sprintf(提示,' Ctrl Z,Enter ')

} else { //类Unix

提示=fmt。Sprintf(提示,' Ctrl D ')

}

}

以下两个go文件演示了:

一个包或go文件可以包含多个init函数,

init函数在main函数之前执行,

init函数是自动调用的,不能在其他函数中调用。显式调用将报告该函数未定义。

Gprog.go代码

主包装

导入(

' fmt '

)

/

/ the other init function in this go source > func init() { fmt.Println("do in init") } func main() { fmt.Println("do in main") } func testf() { fmt.Println("do in testf") //if uncomment the next statment, then go build give error message : .gprog.go:19: undefined: init //init() }

ginit1.go代码,注意这个源文件中有两个init函数

package main
import (
    "fmt"
)
// the first init function in this go source >
func init() {
    fmt.Println("do in init1")
}
// the second init function in this go source >
func init() {
    fmt.Println("do in init2")
}

编译上面两个文件:go build gprog.go ginit1.go

编译之后执行gprog.exe后的结果表明,gprog.go中的init函数先执行,然后执行了ginit1.go中的两个init函数,然后才执行main函数。

E:opensourcegoprjhellogo>gprog.exe
do in init
do in init1
do in init2
do in main

注:《the way to go》中(P70)有下面红色一句描述,意思是说一个go源文件只能有一个init函数,

      但是上面的ginit1.go中的两个init函数编译运行后都正常执行了,

      因此这句话应该是笔误。

4.4.5 Init-functions
Apart from global declaration with initialization, variables can also be initialized in an init()-function.
This is a special function with the name init() which cannot be called, but is executed automatically
before the main() function in package main or at the start of the import of the package that
contains it.
Every source  contain only 1 init()-function. Initialization is always single-threaded and
package dependency guarantees correct execution order.

 

2013.04.21 初稿

2013.04.23 补充说明《the way to go》 中关于init函数的笔误

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。