第1章,局部字词修订。

pull/26/head
zhliner 2017-08-24 22:23:36 +08:00
parent 085771255c
commit 622f7fcc2c
4 changed files with 10 additions and 7 deletions

View File

@ -44,7 +44,7 @@ line := input.Text()
counts[line] = counts[line] + 1
```
`map`中不含某个键时不用担心,首次读到新行时,等号右边的表达式`counts[line]`的值将被计算为其类型的零值对于int`即0。
`map`中不含某个键时不用担心,首次读到新行时,等号右边的表达式`counts[line]`的值将被计算为其类型的零值,对于`int`即0。
为了打印结果,我们使用了基于`range`的循环,并在`counts`这个`map`上迭代。跟之前类似,每次迭代得到两个结果,键和其在`map`中对应的值。`map`的迭代顺序并不确定,从实践来看,该顺序随机,每次运行都会变化。这种设计是有意为之的,因为能防止程序依赖特定遍历顺序,而这是无法保证的。(译注具体可以参见这里http://stackoverflow.com/questions/11853396/google-go-lang-assignment-order)
@ -131,7 +131,7 @@ func countLines(f *os.File, counts map[string]int) {
注意`countLines`函数在其声明前被调用。函数和包级别的变量package-level entities可以任意顺序声明并不影响其被调用。译注最好还是遵循一定的规范
`map`是一个由`make`函数创建的数据结构的引用。`map`作为参数传递给某函数时该函数接收这个引用的一份拷贝copy或译为副本被调用函数对`map`底层数据结构的任何修改,调用者函数都可以通过持有的`map`引用看到。在我们的例子中,`countLines`函数向`counts`插入的值,也会被`main`函数看到。译注类似于C++里的引用传递,实际上指针是另一个指针了,但内部存的值指向同一块内存)
`map`是一个由`make`函数创建的数据结构的引用。`map`作为参数传递给某函数时该函数接收这个引用的一份拷贝copy或译为副本被调用函数对`map`底层数据结构的任何修改,调用者函数都可以通过持有的`map`引用看到。在我们的例子中,`countLines`函数向`counts`插入的值,也会被`main`函数看到。译注类似于C++里的引用传递,实际上指针是另一个指针了,但内部存的值指向同一块内存)
`dup`的前两个版本以"流”模式读取输入,并根据需要拆分成多个行。理论上,这些程序可以处理任意数量的输入数据。还有另一个方法,就是一口气把全部输入数据读到内存中,一次分割为多行,然后处理它们。下面这个版本,`dup3`,就是这么操作的。这个例子引入了`ReadFile`函数(来自于`io/ioutil`包),其读取指定文件的全部内容,`strings.Split`函数把字符串分割成子串的切片。(`Split`的作用与前文提到的`strings.Join`相反。)

View File

@ -67,4 +67,4 @@ main函数中用make函数创建了一个传递string类型参数的channel
**练习 1.10** 找一个数据量比较大的网站用本小节中的程序调研网站的缓存策略对每个URL执行两遍请求查看两次时间是否有较大的差别并且每次获取到的响应内容是否一致修改本节中的程序将响应结果输出以便于进行对比。
**练习 1.11** 在fatchall中尝试使用长一些的参数列表比如使用在alexa.com的上百万网站里排名靠前的。如果一个网站没有回应程序将采取怎样的行为Section8.9 描述了在这种情况下的应对机制)。
**练习 1.11** 在fetchall中尝试使用长一些的参数列表比如使用在alexa.com的上百万网站里排名靠前的。如果一个网站没有回应程序将采取怎样的行为Section8.9 描述了在这种情况下的应对机制)。

View File

@ -112,14 +112,17 @@ func handler(w http.ResponseWriter, r *http.Request) {
```
GET /?q=query HTTP/1.1
Header["Accept-Encoding"] = ["gzip, deflate, sdch"] Header["Accept-Language"] = ["en-US,en;q=0.8"]
Header["Accept-Encoding"] = ["gzip, deflate, sdch"]
Header["Accept-Language"] = ["en-US,en;q=0.8"]
Header["Connection"] = ["keep-alive"]
Header["Accept"] = ["text/html,application/xhtml+xml,application/xml;..."] Header["User-Agent"] = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)..."] Host = "localhost:8000"
Header["Accept"] = ["text/html,application/xhtml+xml,application/xml;..."]
Header["User-Agent"] = ["Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5)..."]
Host = "localhost:8000"
RemoteAddr = "127.0.0.1:59911"
Form["q"] = ["query"]
```
可以看到这里的ParseForm被嵌套在了if语句中。Go语言允许这样的一个简单的语句结果作为循环的变量声明出现在if语句的最前面这一点对错误处理很有用处。我们还可以像下面这样写当然看起来就长了一些
可以看到这里的ParseForm被嵌套在了if语句中。Go语言允许这样的一个简单的语句结果作为局部的变量声明出现在if语句的最前面这一点对错误处理很有用处。我们还可以像下面这样写当然看起来就长了一些
```go
err := r.ParseForm()

View File

@ -61,7 +61,7 @@ Go语言尤其适合编写网络服务相关基础设施同时也适合开发
和机器学习等诸多领域。目前Go语言已经成为受欢迎的作为无类型的脚本语言的替代者
因为Go编写的程序通常比脚本语言运行的更快也更安全而且很少会发生意外的类型错误。
Go语言还是一个开源的项目可以免费获编译器、库、配套工具的源代码。
Go语言还是一个开源的项目可以免费获编译器、库、配套工具的源代码。
Go语言的贡献者来自一个活跃的全球社区。Go语言可以运行在类[UNIX](http://doc.cat-v.org/unix/)系统——
比如[Linux](http://www.linux.org/)、[FreeBSD](https://www.freebsd.org/)、[OpenBSD](http://www.openbsd.org/)、[Mac OSX](http://www.apple.com/cn/osx/)——和[Plan9](http://plan9.bell-labs.com/plan9/)系统和[Microsoft Windows](https://www.microsoft.com/zh-cn/windows/)操作系统之上。
Go语言编写的程序无需修改就可以运行在上面这些环境。