This commit is contained in:
Xargin 2016-07-20 15:08:47 +08:00
parent fd1283d830
commit c48cca9a77
8 changed files with 10 additions and 7 deletions

View File

@ -2,7 +2,7 @@
任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。
每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以避免我们使用它们的时候减少和其它部分名字的冲突。
每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以在使用它们的时候减少和其它部分名字的冲突。
每个包还通过控制包内名字的可见性和是否导出来实现封装特性。通过限制包成员的可见性并隐藏包API的具体实现将允许包的维护者在不影响外部包用户的前提下调整包的内部实现。通过限制包内变量的可见性还可以强制用户通过某些特定函数来访问和更新内部变量这样可以保证内部变量的一致性和并发时的互斥约束。

View File

@ -1,6 +1,6 @@
## 10.3. 包声明
在每个Go语源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其它包导入时默认的标识符(也称为包名)。
在每个Go语源文件的开头都必须有包声明语句。包声明语句的主要目的是确定当前包被其它包导入时默认的标识符(也称为包名)。
例如math/rand包的每个源文件的开头都包含`package rand`包声明语句所以当你导入这个包你就可以用rand.Int、rand.Float64类似的方式访问包的成员。

View File

@ -38,7 +38,7 @@ GOPATH对应的工作区目录有三个子目录。其中src子目录用于存
第二个环境变量GOROOT用来指定Go的安装目录还有它自带的标准库包的位置。GOROOT的目录结构和GOPATH类似因此存放fmt包的源代码对应目录应该为$GOROOT/src/fmt。用户一般不需要设置GOROOT默认情况下Go语言安装工具会将其设置为安装的目录路径。
其中`go env`命令用于查看Go语工具涉及的所有环境变量的值包括未设置环境变量的默认值。GOOS环境变量用于指定目标操作系统例如android、linux、darwin或windowsGOARCH环境变量用于指定处理器的类型例如amd64、386或arm等。虽然GOPATH环境变量是唯一必需要设置的但是其它环境变量也会偶尔用到。
其中`go env`命令用于查看Go语工具涉及的所有环境变量的值包括未设置环境变量的默认值。GOOS环境变量用于指定目标操作系统例如android、linux、darwin或windowsGOARCH环境变量用于指定处理器的类型例如amd64、386或arm等。虽然GOPATH环境变量是唯一必需要设置的但是其它环境变量也会偶尔用到。
```
$ go env

View File

@ -37,4 +37,6 @@ $ ./fetch https://golang.org/x/net/html | grep go-import
`go get -u`命令只是简单地保证每个包是最新版本如果是第一次下载包则是比较很方便的但是对于发布程序则可能是不合适的因为本地程序可能需要对依赖的包做精确的版本依赖管理。通常的解决方案是使用vendor的目录用于存储依赖包的固定版本的源代码对本地依赖的包的版本更新也是谨慎和持续可控的。在Go1.5之前一般需要修改包的导入路径所以复制后golang.org/x/net/html导入路径可能会变为gopl.io/vendor/golang.org/x/net/html。最新的Go语言命令已经支持vendor特性但限于篇幅这里并不讨论vendor的具体细节。不过可以通过`go help gopath`命令查看Vendor的帮助文档。
(译注墙内用户在上面这些命令的基础上还需要学习用翻墙来go get。)
**练习 10.3:** 从 http://gopl.io/ch1/helloworld?go-get=1 获取内容,查看本书的代码的真实托管的网址(`go get`请求HTML页面时包含了`go-get`参数,以区别普通的浏览器请求)。

View File

@ -58,6 +58,7 @@ $ ./quoteargs one "two three" four\ five
$ go run quoteargs.go one "two three" four\ five
["one" "two three" "four five"]
```
(译注其实也可以偷懒直接go run `*.go`)
第一行的参数列表中,第一个不是以`.go`结尾的将作为可执行程序的参数运行。

View File

@ -1,6 +1,6 @@
### 10.7.5. 内部包
在Go语程序中,包的封装机制是一个重要的特性。没有导出的标识符只在同一个包内部可以访问,而导出的标识符则是面向全宇宙都是可见的。
在Go语程序中,包的封装机制是一个重要的特性。没有导出的标识符只在同一个包内部可以访问,而导出的标识符则是面向全宇宙都是可见的。
有时候,一个中间的状态可能也是有用的,对于一小部分信任的包是可见的,但并不是对所有调用者都可见。例如,当我们计划将一个大的包拆分为很多小的更容易维护的子包,但是我们并不想将内部的子包结构也完全暴露出去。同时,我们可能还希望在内部子包之间共享一些通用的处理包,或者我们只是想实验一个新包的还并不稳定的接口,暂时只暴露给一些受限制的用户使用。

View File

@ -2,6 +2,6 @@
现在随便一个小程序的实现都可能包含超过10000个函数。然而作者一般只需要考虑其中很小的一部分和做很少的设计因为绝大部分代码都是由他人编写的它们通过类似包或模块的方式被重用。
Go语言有超过100个的标准包译注可以用`go list std | wc -l`命令查看标准包的具体数目标准库为大多数的程序提供了必要的基础构件。在Go的社区有很多成熟的包被设计、共享、重用和改进目前互联网上已经发布了非常多的Go语开源包,它们可以通过 http://godoc.org 检索。在本章,我们将演示如果使用已有的包和创建新的包。
Go语言有超过100个的标准包译注可以用`go list std | wc -l`命令查看标准包的具体数目标准库为大多数的程序提供了必要的基础构件。在Go的社区有很多成熟的包被设计、共享、重用和改进目前互联网上已经发布了非常多的Go语开源包,它们可以通过 http://godoc.org 检索。在本章,我们将演示如果使用已有的包和创建新的包。
Go还自带了工具箱里面有很多用来简化工作区和包管理的小工具。在本书开始的时候我们已经见识过如何使用工具箱自带的工具来下载、构和运行我们的演示程序了。在本章,我们将看看这些工具的基本设计理论和尝试更多的功能,例如打印工作区中包的文档和查询相关的元数据等。在下一章,我们将探讨探索包的单元测试用法。
Go还自带了工具箱里面有很多用来简化工作区和包管理的小工具。在本书开始的时候我们已经见识过如何使用工具箱自带的工具来下载、构和运行我们的演示程序了。在本章,我们将看看这些工具的基本设计理论和尝试更多的功能,例如打印工作区中包的文档和查询相关的元数据等。在下一章,我们将探讨探索包的单元测试用法。

View File

@ -1,5 +1,5 @@
# 第十二章 反射
Go语提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。
Go语提供了一种机制在运行时更新变量和检查它们的值、调用它们的方法和它们支持的内在操作,但是在编译时并不知道这些变量的具体类型。这种机制被称为反射。反射也可以让我们将类型本身作为第一类的值类型处理。
在本章我们将探讨Go语言的反射特性看看它可以给语言增加哪些表达力以及在两个至关重要的API是如何用反射机制的一个是fmt包提供的字符串格式功能另一个是类似encoding/json和encoding/xml提供的针对特定协议的编解码功能。对于我们在4.6节中看到过的text/template和html/template包它们的实现也是依赖反射技术的。然后反射是一个复杂的内省技术不应该随意使用因此尽管上面这些包内部都是用反射技术实现的但是它们自己的API都没有公开反射相关的接口。