diff --git a/2.3.md b/2.3.md index 505c72fc..e4ef4564 100644 --- a/2.3.md +++ b/2.3.md @@ -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 * [目录]() diff --git a/2.4.md b/2.4.md index a8956c06..8469b96f 100644 --- a/2.4.md +++ b/2.4.md @@ -1,5 +1,5 @@ #2.4 高级类型 -##strcut +##struct Go语言中,也和C或者其他语言中一样,我们可以声明新的类型,作为其它类型的属性或字段的容器。例如,我们可以创建一个自定义类型`person`代表一个人的实体。这个实体拥有属性:姓名和年龄。这样的类型我们称之`struct`。如下代码所示: type person struct { diff --git a/images/2.3.init.png b/images/2.3.init.png new file mode 100644 index 00000000..192b605b Binary files /dev/null and b/images/2.3.init.png differ