From 0c48b5475fef62dbb22dd0a0c81565b49ebe61a2 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Tue, 14 Aug 2018 20:45:43 +0800 Subject: [PATCH] =?UTF-8?q?ch1.4:=20=E8=A7=84=E8=8C=83=E5=8C=96=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E7=BC=96=E5=8F=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch1-basic/ch1-04-func-method-interface.md | 5 ++++- ...ch1-04-init.ditaa.png => ch1.4-1-init.ditaa.png} | Bin ...ch1-04-init.ditaa.txt => ch1.4-1-init.ditaa.txt} | 0 3 files changed, 4 insertions(+), 1 deletion(-) rename images/{ch1-04-init.ditaa.png => ch1.4-1-init.ditaa.png} (100%) rename images/{ch1-04-init.ditaa.txt => ch1.4-1-init.ditaa.txt} (100%) diff --git a/ch1-basic/ch1-04-func-method-interface.md b/ch1-basic/ch1-04-func-method-interface.md index c03fd5c..cf764a1 100644 --- a/ch1-basic/ch1-04-func-method-interface.md +++ b/ch1-basic/ch1-04-func-method-interface.md @@ -4,7 +4,10 @@ Go语言程序的初始化和执行总是从`main.main`函数开始的。但是如果`main`包导入了其它的包,则会按照顺序将它们包含进`main`包里(这里的导入顺序依赖具体实现,一般可能是以文件名或包路径名的字符串顺序导入)。如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的`init`函数,如果一个包有多个`init`函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同一个文件内的多个`init`则是以出现的顺序依次调用(`init`不是普通函数,可以定义有多个,所以也不能被其它函数调用)。最后,当`main`包的所有包级常量、变量被创建和初始化完成,并且`init`函数被执行后,才会进入`main.main`函数,程序开始正常执行。下图是Go程序函数启动顺序的示意图: -![](../images/ch1-04-init.ditaa.png) +![](../images/ch1.4-1-init.ditaa.png) + +*图 1.4-1 包初始化流程* + 要注意的是,在`main.main`函数执行之前所有代码都运行在同一个goroutine,也就是程序的主系统线程中。因此,如果某个`init`函数内部用go关键字启动了新的goroutine的话,新的goroutine只有在进入`main.main`函数之后才可能被执行到。 diff --git a/images/ch1-04-init.ditaa.png b/images/ch1.4-1-init.ditaa.png similarity index 100% rename from images/ch1-04-init.ditaa.png rename to images/ch1.4-1-init.ditaa.png diff --git a/images/ch1-04-init.ditaa.txt b/images/ch1.4-1-init.ditaa.txt similarity index 100% rename from images/ch1-04-init.ditaa.txt rename to images/ch1.4-1-init.ditaa.txt