重新写了init函数这一小节

This commit is contained in:
xiemengjun
2012-08-29 22:35:39 +08:00
parent 496e80a468
commit 95760d9028
3 changed files with 10 additions and 16 deletions

24
2.3.md
View File

@@ -437,22 +437,16 @@ Recover
return
}
###init函数
Go的每个源文件可以定义自己的init函数来设置需要初始化信息。(实际上允许每个文件有多个init函数)。执行玩包中的所有init函数之后执行完所有变量声明后初始化他们的值之后整个的包才被初始化完毕。init函数的一种常见用法是真正开始执行之前验证或修复的程序状态的正确性。
###main函数和init函数
func init() {
if USER == "" {
log.Fatal("$USER not set")
}
if HOME == "" {
HOME = "/usr/" + USER
}
if GOROOT == "" {
GOROOT = HOME + "/go"
}
// GOROOT may be overridden by --goroot flag on command line.
flag.StringVar(&GOROOT, "goroot", GOROOT, "Go root directory")
}
Go里面有两个保留的函数init函数(能够应用于所有的package)和main函数(只能应用于package main)。这两个函数定义的时候必须都是没有任何参数也没有任何返回值的。虽然一个package里面可以随便写多个init函数但是对于易读性还是以后的维护性来说我们还是强烈建议用户一个package只写一个init函数。
Go程序里面会自动调用init()和main()所以你不需要在任何地方调用这两个函数。init函数每个package里面是可选的但是对于package main就必须包含一个main函数
初始化和执行程序都是开始于main包如果有import其他包那么依次import进来。虽然有很多个包里面import了同一个包但是这个包只会import一次(例如fmt包可能很多package里面都会用到但是只import了一次因为没有必要包含多次)。当一个package被import进来的时候如果他本身还import了其他包那么先执行import其他包然后执行这个包里面的包级别的常量和变量然后执行init函数(如果包里面有的话)。最后所有的被main包import的包都加载完毕了然后开始执行main包里面的常量和变量的初始化然后执行main包里面的init函数(如果存在的话)最后执行到了main函数。下图详细的解释了整个的执行过程。
![](images/2.3.init.png?raw=true)
## links
* [目录](<preface.md>)