From 1c007e46735b29ddec2d1f58e1ad353031a2001f Mon Sep 17 00:00:00 2001 From: chai2010 Date: Mon, 23 Jul 2018 11:37:19 +0800 Subject: [PATCH] =?UTF-8?q?ch1:=20=E6=9B=B4=E6=96=B0=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch1-basic/ch1-04-func-method-interface.md | 2 +- ch1-basic/ch1-05-mem.md | 2 +- images/ch1-04-init.ditaa.png | Bin 0 -> 10600 bytes images/ch1-04-init.ditaa.txt | 23 ++++++++++++++++++++++ 4 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 images/ch1-04-init.ditaa.png create mode 100644 images/ch1-04-init.ditaa.txt diff --git a/ch1-basic/ch1-04-func-method-interface.md b/ch1-basic/ch1-04-func-method-interface.md index 1faad33..22ba086 100644 --- a/ch1-basic/ch1-04-func-method-interface.md +++ b/ch1-basic/ch1-04-func-method-interface.md @@ -4,7 +4,7 @@ Go语言程序的初始化和执行总是从`main.main`函数开始的。但是如果`main`包导入了其它的包,则会按照顺序将它们包含进`main`包里(这里的导入顺序依赖具体实现,一般可能是以文件名或包路径名的字符串顺序导入)。如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的`init`函数,如果一个包有多个`init`函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同一个文件内的多个`init`则是以出现的顺序依次调用(`init`不是普通函数,可以定义有多个,所以也不能被其它函数调用)。最后,当`main`包的所有包级常量、变量被创建和初始化完成,并且`init`函数被执行后,才会进入`main.main`函数,程序开始正常执行。下图是Go程序函数启动顺序的示意图: -![](../images/ch1-04-init.png) +![](../images/ch1-04-init.ditaa.png) 要注意的是,在`main.main`函数执行之前所有代码都运行在同一个goroutine,也就是程序的主系统线程中。因此,如果某个`init`函数内部用go关键字启动了新的goroutine的话,新的goroutine只有在进入`main.main`函数之后才可能被执行到。 diff --git a/ch1-basic/ch1-05-mem.md b/ch1-basic/ch1-05-mem.md index 3356c03..3aa59d5 100644 --- a/ch1-basic/ch1-05-mem.md +++ b/ch1-basic/ch1-05-mem.md @@ -259,7 +259,7 @@ func main() { Go程序的初始化和执行总是从`main.main`函数开始的。但是如果`main`包里导入了其它的包,则会按照顺序将它们包含进`main`包里(这里的导入顺序依赖具体实现,一般可能是以文件名或包路径名的字符串顺序导入)。如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量。然后就是调用包里的`init`函数,如果一个包有多个`init`函数的话,实现可能是以文件名的顺序调用,同一个文件内的多个`init`则是以出现的顺序依次调用(`init`不是普通函数,可以定义有多个,所以不能被其它函数调用)。最终,在`main`包的所有包常量、包变量被创建和初始化,并且`init`函数被执行后,才会进入`main.main`函数,程序开始正常执行。下图是Go程序函数启动顺序的示意图: -![](../images/ch1-04-init.png) +![](../images/ch1-04-init.ditaa.png) 要注意的是,在`main.main`函数执行之前所有代码都运行在同一个goroutine中,也是运行在程序的主系统线程中。如果某个`init`函数内部用go关键字启动了新的goroutine的话,新的goroutine只有在进入`main.main`函数之后才可能被执行到。 diff --git a/images/ch1-04-init.ditaa.png b/images/ch1-04-init.ditaa.png new file mode 100644 index 0000000000000000000000000000000000000000..8b4bed23f1ba6316a551d805214ae08532253a1e GIT binary patch literal 10600 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 literal 0 HcmV?d00001 diff --git a/images/ch1-04-init.ditaa.txt b/images/ch1-04-init.ditaa.txt new file mode 100644 index 0000000..863b0b6 --- /dev/null +++ b/images/ch1-04-init.ditaa.txt @@ -0,0 +1,23 @@ + +-------------+ +-------------+ +-------------+ +-------------+ + | main | | pkg1 | | pkg2 | | pkg3 | + | | | | | | | | +-->| import pkg1 +-=-->| import pkg2 +-=-->| import pkg3 +-=-->| const | + | | | | | | | | | | | | + | : | | : | | : | | : | + | v | | v | | v | | v | + | const |<-\ | const |<-\ | const |<-\ | var | + | | | | | | | | | | | | | | | + | : | | | : | | | : | | | : | + | v | | | v | | | v | | | v | + | var | | | var | | | var | | | init() | + | | | | | | | | | | | | +------+------+ + | : | | | : | | | : | | | + | v | | | v | | | v | \-=-------/ + | init() | | | init() | | | init() | + | | | | | init() | | +------+------+ + | : | | +------+------+ | | + | v | | | \-=-------/ + | main() | \-=-------/ + +-------------+ + +