mirror of
https://github.com/gopl-zh/gopl-zh.github.com.git
synced 2024-12-24 22:08:57 +00:00
第1章,局部字词修订。
This commit is contained in:
parent
085771255c
commit
622f7fcc2c
@ -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`相反。)
|
||||
|
||||
|
@ -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 描述了在这种情况下的应对机制)。
|
||||
|
@ -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()
|
||||
|
@ -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语言编写的程序无需修改就可以运行在上面这些环境。
|
||||
|
Loading…
Reference in New Issue
Block a user