第九章修改 (#841)

Co-authored-by: Joe Chen <jc@unknwon.io>
This commit is contained in:
Haigang Zhou
2022-05-11 02:04:17 +08:00
committed by GitHub
parent 30ca13a369
commit 471d59af32
11 changed files with 80 additions and 70 deletions

View File

@@ -88,11 +88,12 @@ Import with `_` :
import _ "./pack1/pack1"
pack1 包只导入其副作用,也就是说,只执行它的 init 函数并初始化其中的全局变量。
`pack1` 包只导入其副作用,也就是说,只执行它的 `init()` 函数并初始化其中的全局变量。
**导入外部安装包:**
如果你要在你的应用中使用一个或多个外部包,首先你必须使用 `go install`(参见第 9.7 节)在你的本地机器上安装它们。
如果你要在你的应用中使用一个或多个外部包,首先你必须使用 `go install`(参见[第 9.7 节](09.7.md))在你的本地机器上安装它们。
假设你想使用 `http://codesite.ext/author/goExample/goex` 这种托管在 Google Code、GitHub 和 Launchpad 等代码网站上的包。
@@ -112,17 +113,19 @@ pack1 包只导入其副作用,也就是说,只执行它的 init 函数并
**包的初始化:**
程序的执行开始于导入包,初始化 main 包然后调用 main 函数。
程序的执行开始于导入包,初始化 `main` 包然后调用 `main()` 函数。
一个没有导入的包将通过分配初始值给所有的包级变量和调用源码中定义的包级 init 函数来初始化。一个包可能有多个 init 函数甚至在一个源码文件中。它们的执行是无序的。这是最好的例子来测定包的值是否只依赖于相同包下的其他值或者函数。
一个没有导入的包将通过分配初始值给所有的包级变量和调用源码中定义的包级 `init()` 函数来初始化。一个包可能有多个 `init()` 函数甚至在一个源码文件中。它们的执行是无序的。这是最好的例子来测定包的值是否只依赖于相同包下的其他值或者函数。
init 函数是不能被调用的。
`init()` 函数是不能被调用的。
导入的包在包自身初始化前被初始化,而一个包在程序执行中只能初始化一次。
**编译并安装一个包(参见第 9.7 节):**
**编译并安装一个包参见[第 9.7 节](09.7.md)**
在 Linux/OS X 下可以用类似[第 3.9 节](03.9.md)的 Makefile 脚本做到这一点:
在 Linux/OS X 下可以用类似第 3.9 节的 Makefile 脚本做到这一点:
include $(GOROOT)/src/Make.inc
TARG=pack1
@@ -131,15 +134,17 @@ init 函数是不能被调用的。
pack1b.go\
include $(GOROOT)/src/Make.pkg
通过 `chmod 777 ./Makefile`确保它的可执行性。
通过 `chmod 777 ./Makefile` 确保它的可执行性。
上面脚本内的 include 语句引入了相应的功能,将自动检测机器的架构并调用正确的编译器和链接器。
上面脚本内的 `include` 语句引入了相应的功能,将自动检测机器的架构并调用正确的编译器和链接器。
然后终端执行 make 或 `gomake` 工具:他们都会生成一个包含静态库 pack1.a 的 _obj 目录。
然后终端执行 `make``gomake` 工具:他们都会生成一个包含静态库 `pack1.a``_obj` 目录。
go install参见第 9.7 节,从 Go1 的首选方式)同样复制 pack1.a 到本地的 $GOROOT/pkg 的目录中一个以操作系统为名的子目录下。像 `import "pack1"` 代替 `import "path to pack1"`,这样只通过名字就可以将包在程序中导入。
go install参见[第 9.7 节](09.7.md),从 Go1 的首选方式)同样复制 `pack1.a` 到本地的 `$GOROOT/pkg` 的目录中一个以操作系统为名的子目录下。像 `import "pack1"` 代替 `import "path to pack1"`,这样只通过名字就可以将包在程序中导入。
当[第 13 章](13.0.md) 我们遇到使用测试工具进行测试的时候我们将重新回到自己的包的制作和编译这个话题。
当第 13 章我们遇到使用测试工具进行测试的时候我们将重新回到自己的包的制作和编译这个话题。
**问题 9.1**
@@ -147,23 +152,24 @@ a一个包能分成多个源文件么
b一个源文件是否能包含多个包
**练习 9.3**
**练习 9.3** [main_greetings.go](exercises\chapter_9\main_greetings.go)
创建一个程序 main_greetings.go 能够和用户说 "Good Day" 或者 "Good Night"。不同的问候应该放到单独的 greetings 包中。
创建一个程序 main_greetings.go 能够和用户说 `"Good Day"` 或者 `"Good Night"`。不同的问候应该放到单独的 `greetings` 包中。
在同一个包中创建一个 `IsAM` 函数返回一个布尔值用来判断当前时间是 AM 还是 PM同样创建 `IsAfternoon``IsEvening` 函数。
使用 main_greetings 作出合适的问候(提示:使用 time 包)。
使用 main_greetings 作出合适的问候(提示:使用 `time` 包)。
**练习 9.4** 创建一个程序 main_oddven.go 判断前 100 个整数是不是偶数,将判断所用的函数编写在 even 包里。
**练习 9.4** 创建一个程序 [main_oddven.go](exercises\chapter_9\main_oddeven.go) 判断前 100 个整数是不是偶数,将判断所用的函数编写在 `even` 包里。
**练习 9.5** 使用第 6.6 节的斐波那契程序:
**练习 9.5** 使用[第 6.6 节](06.6.md)的斐波那契程序:
1将斐波那契功能放入自己的 fibo 包中并通过主程序调用它,存储最后输入的值在函数的全局变量。
2扩展 fibo 包将通过调用斐波那契的时候,操作也作为一个参数。实验 "+" 和 “*”
1将斐波那契功能放入自己的 `fibo` 包中并通过主程序调用它,存储最后输入的值在函数的全局变量。
main_fibo.go / fibonacci.go
2扩展 `fibo` 包将通过调用斐波那契的时候,操作也作为一个参数。实验 `"+"``"*"`
[main_fibo.go](exercises\chapter_9\main_fibo.go) / [fibonacci.go](exercises/chapter_6/fibonacci.go)
## 链接