勘误信息

This commit is contained in:
chai2010 2019-07-26 07:25:57 +08:00
parent 10caf84852
commit 46594e79f5
8 changed files with 139 additions and 2 deletions

View File

@ -1,6 +1,6 @@
# 1.1 Go语言创世纪
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视最终的目标是设计网络和多核时代的C语言。到2008年中期语言的大部分特性设计已经完成并开始着手实现编译器和运行时大约在这一年Russ Cox作为主力开发者加入。到了2010年Go语言已经逐步趋于稳定。同年9月Go语言正式发布并开源了代码。
Go语言最初由Google公司的Robert Griesemer、Ken Thompson和Rob Pike三个大牛于2007年开始设计发明设计新语言的最初的洪荒之力来自于对超级复杂的C++11特性的吹捧报告的鄙视最终的目标是设计网络和多核时代的C语言。到2008年中期语言的大部分特性设计已经完成并开始着手实现编译器和运行时大约在这一年Russ Cox作为主力开发者加入。到了2009Go语言已经逐步趋于稳定。同年9月Go语言正式发布并开源了代码。
Go语言很多时候被描述为“类C语言”或者是“21世纪的C语言”。从各种角度看Go语言确实是从C语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等诸多编程思想还有彻底继承和发扬了C语言简单直接的暴力编程哲学等。图1-1是《Go语言圣经》中给出的Go语言的基因图谱我们可以从中看到有哪些编程语言对Go语言产生了影响。

97
errata/README.md Normal file
View File

@ -0,0 +1,97 @@
# 勘误·第一版第一次印刷
## 1. ch3.4最后一个图有错误
sum函数的`ret+24(FP)`改为`ret+16(FP)`
## 2. ch3.5 控制流 - for例子有错误 #438
171页第一个代码段改为
```go
func LoopAdd(cnt, v0, step int) int {
result, vi := 0, v0
for i := 0; i < cnt; i++ {
result, vi = result+vi, vi+step
}
return result
}
```
改动的代码有2行:
1. `result := v0`改为`result, vi := 0, v0`
2. `result += step`改为`result, vi = result+vi, vi+step`
171页第二个代码段改为:
```go
func LoopAdd(cnt, v0, step int) int {
var vi = v0
var result = 0
// LOOP_BEGIN:
var i = 0
LOOP_IF:
if i < cnt { goto LOOP_BODY }
goto LOOP_END
LOOP_BODY:
i = i+1
result = result + vi
vi = vi + step
goto LOOP_IF
LOOP_END:
return result
}
```
改动的部分:
1. `var i = 0`改为`var vi = v0`
2. `LOOP_BEGIN:`变成注释,其后的代码改为`var i = 0`
3. LOOP_BODY中`result = result + step`改为`result = result + vi`
4. LOOP_BODY中增加一行`vi = vi + step`
第三个代码段改为:
```go
#include "textflag.h"
// func LoopAdd(cnt, v0, step int) int
TEXT ·LoopAdd(SB), NOSPLIT, $0-32
MOVQ $0, BX // result
MOVQ cnt+0(FP), AX // cnt
MOVQ v0+8(FP), DI // vi = v0
MOVQ step+16(FP), CX // step
LOOP_BEGIN:
MOVQ $0, DX // i
LOOP_IF:
CMPQ DX, AX // compare i, cnt
JL LOOP_BODY // if i < cnt: goto LOOP_BODY
JMP LOOP_END
LOOP_BODY:
ADDQ DI, BX // result += vi
ADDQ CX, DI // vi += step
ADDQ $1, DX // i++
JMP LOOP_IF
LOOP_END:
MOVQ BX, ret+24(FP) // return result
RET
```
 以上三个代码段其实是同一个程序的不同版本,他们的改动都是相同的问题。
## ch1.1时间有错误
第1页“到了2010年Go语言已经逐步趋于稳定。同年9月Go语言正式发布并开源了代码。”
其中2010改为2009.

11
errata/a.go Normal file
View File

@ -0,0 +1,11 @@
package main
import (
"fmt"
)
func main() {
fmt.Println("Hello, playground", LoopAdd(100, 1, 1))
}
func LoopAdd(cnt, v0, step int) int

27
errata/a_amd64.s Normal file
View File

@ -0,0 +1,27 @@
#include "textflag.h"
// func LoopAdd(cnt, v0, step int) int
TEXT ·LoopAdd(SB), NOSPLIT, $0-32
MOVQ $0, BX // result
MOVQ cnt+0(FP), AX // cnt
MOVQ v0+8(FP), DI // vi = v0
MOVQ step+16(FP), CX // step
LOOP_BEGIN:
MOVQ $0, DX // i
LOOP_IF:
CMPQ DX, AX // compare i, cnt
JL LOOP_BODY // if i < cnt: goto LOOP_BODY
JMP LOOP_END
LOOP_BODY:
ADDQ DI, BX // result += vi
ADDQ CX, DI // vi += step
ADDQ $1, DX // i++
JMP LOOP_IF
LOOP_END:
MOVQ BX, ret+24(FP) // return result
RET

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

2
go.mod
View File

@ -5,3 +5,5 @@
module chai2010.cn/gobook
require github.com/chai2010/advanced-go-programming-book v0.0.0-20181214135029-bcf560505d53 // indirect
go 1.13

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -22,7 +22,7 @@
| | | cYEL |c-8(SP) sum frame
| | +----------+ +----------+
| call sum | | | : |
| | | sum.ret |<----=---|ret+24(FP)|
| | | sum.ret |<----=---|ret+16(FP)|
| | +16(SP)| cPNK | return | |ret+16(FP)
| | +----------+ +----------+
| | | | : |