《The Go programming language》是一本写的很好的书,我本来买了中文版看,但是翻了几页,实在是看不懂。于是买了一本英文版来对照着看,本来以为看英文可能会比较吃力,但是没想到英文读起来要比中文流畅的多。同时还发现中文版翻译中的好多错误,在此记录一下。

1. page101, “我们可以忽略掉整个日志”,应该为“我们可以忽略掉整个错误”
2. page101 "进行错误检查之后,检测到失败的情况往往都在成功之前" 应该为“进行错误检查之后,首先进行错误处理,然后再处理正常的逻辑”
3. page101 “之后跟着实际的函数体一直到最后” 后面一句漏翻译了“以最大限度的减少缩进”。
4. page101 "偶尔, 一个程序必须针对不同各种类的错误采取不同的措施" 应该为“然而,程序有时候需要根据发生的不同种类的错误采取不同的处理方式”
5. 英文版P132, 中文版P102
"而且它们可以赋给 变量或者传递或者从其他函数返回", 应该为:
"而且,它们可以赋值给变量或者传递给其他函数,或者从其他函数返回"
6. 英文版P133, 中文版P103
“这样的代码组织给调用者提供了很多的灵活性” 建议改为:
"这样的代码组织给调用者提供了极大的灵活性"

7. 英文版30, 中文版22
"包级别的初始化在main开始之前进行" 应该为:
“包级别的变量初始化在main函数开始执行之前进行”

“局部变量初始化和声明一样在函数执行期间进行” 应该为:
“局部变量的初始化在函数遇到其声明语句的时候进行”

8. 英文版31, 中文版23
“短变量声明不需要声明所有在左边的变量” 建议改为:
“短变量声明不需要声明所有在:=左侧的变量”

“如果一些变量在同一个词法块中声明, 那么对于这些变量,短声明的行为等同于赋值” 应改为:
“如果某些变量已经在同一个词法块中声明过了,那么对于这些变量,短声明的行为等同于赋值”

already 没有翻译造成中文意思错误

9. 英文版P32, 中文版P24
“变量有时候使用一个地址化的值” 应为:
“变量有时候被描述为可寻址的值”

10. 英文版P35, 中文版P27
“这个规则有一个例外:两个变量的类型不携带任何信息且是零值, 例如struct{}或者[0]int,当前的实现里面,它们有相同的地址”  这一段翻译完全错误,英文原文是
“There is one exception to this rule: two variables whose type carries no information and is therefore of size zero, such as struct{} or [0]int, may, depending on the implementation, have the same address.”
应该翻译为:
“这个规则有一个例外:两个变量的类型不携带任何信息,因此其size是0,例如struct{}或者[0]int, 可能具有相同的地址,这取决于具体实现。”

11. 英文版P35,中文版P27
“每次执行声明语句时创建一个新的实体,变量一直生存到它变得不可访问,这时它占用的存储空间被回收” 应该为:
“每次执行声明语句时创建一个新的实例,变量一直生存到它变得不可访问为止,这时它占用的内存可能会被回收”

两字之差,意思就不一样了。一个变量没有被引用了,那么它的生命周期结束了,但是并不一定会被马上回收,可能会有一些延时,这个要看具体的垃圾回收算法是如何实现的。

12. 英文版P36, 中文版P26
“即使包含它的循环已经返回,它的存在还可能延续” 应该为:
“即使包含它的函数已经返回,它的存在还可能延续”

13.英文版P36,中文版P26
“编译器可以选择使用堆或栈上的空间来分配” 翻译错误
原文是
“A compiler may choose to allocate local variables on the heap or on the stack but,...”
也就是说,编译器可以选择在栈上或者堆上分配局部变量,注意是局部变量,并没有提到包级变量

14.英文版P36,中文版P26

“令人惊奇的是,这个选择不是基于使用var或new关键字来声明变量”   翻译错误
在go中,new是一个预定义的函数,并不是关键字,所以在英文原文中,刻意避免了使用keyword这个说法
英文原文:
“this choice is not determined by whether var or new was used to declare the variable.”
应该翻译为:
“这种选择不是根据是否使用了var或new来确定的”

15.英文版P36, 中文版P27
“任何情况下,逃逸的概念使你不需要额外费心来写正确的代码” 翻译错误
原文是
“In any case, the notion of escaping is not something that you need to worry about in order to write correct code”
中文版完全偏离了英文版表达的意思。正确的翻译应该为:
“在任何情况下,你都不需要担心逃逸的概念影响到你写出正确的代码”

16.英文版P36,中文版P27
“赋值语句用来更新变量所指的值”  
什么是变量所指的值?根本没有这种说法,中文让人很迷惑
英文原文是
“the value held by a variable is updated by an assignment statement”
直接翻译成
“赋值语句用来更新变量的值” 更好

17. 英文版36,中文版P27
“每一个算术和二进制位操作符” 翻译错误

“binary operator”是指二元操作符,没有二进制操作符的说法。

18.英文版P37, 中文版P28
“多重赋值也可以使一个普通的赋值序列变得紧凑”
原文是
“Tuple assignment can also make a sequence of trivial assignments more compact”
trivial意为繁琐的,不知道为什么翻译成普通的,这句话翻译成下面更好
“多重赋值也可以使一系列繁琐的赋值变得更加紧凑”

19.英文版P37,中文版P28
“这类表达式(例如一个有多个返回值的函数调用)产生多个值” 翻译有问题,
这类是哪一类?前文也没有提到,英文是“certain exxpressions”应该翻译成“某些表达式...”

20.英文版P40, 中文版P30
 “Named types also make it possible to define new behaviors for values of the type. 
These behaviors are expressed as a set of functions associated with type, called the type's methods, 
we'll look at methods in detail in Chapter 6 but will give a taste of the mechanism here"
这一段直接漏掉了没有翻译。

21.英文版P41, 中文版P30

fmt.Printf("%v\n", c) // "100℃" 不需要调用字符串

应该为不需要调用String函数,不需要调用字符串这种翻译真的是让人彻底无语。。。

22.英文版44页, 中文版32页

“Better still, use the golang.org/x/tools/cmd/goimports tool, which automatically inserts and removes packages 
from import declaration as necessary; most editors can be configured to run goimports each time you save a file. 
Like the gofmt tools, it also pretty-prints Go sources files in the canonical format.”

整段直接就不翻译了??

23. 英文版48页,中文版36页
f.ReadByte()  写成了 f.Stat()

“成功执行的路径不会变的支离破碎” 应为:
“返回成功的执行路径不会被缩进

自作聪明,乱翻译