勘误·第一版第一次印刷

1. ch3.4最后一个图有错误

sum函数的ret+24(FP)改为ret+16(FP)

2. ch3.5 控制流 - for例子有错误 #438

171页第一个代码段改为:

  1. func LoopAdd(cnt, v0, step int) int {
  2. result, vi := 0, v0
  3. for i := 0; i < cnt; i++ {
  4. result, vi = result+vi, vi+step
  5. }
  6. return result
  7. }

改动的代码有2行:

  1. result := v0改为result, vi := 0, v0
  2. result += step改为result, vi = result+vi, vi+step

171页第二个代码段改为:

  1. func LoopAdd(cnt, v0, step int) int {
  2. var vi = v0
  3. var result = 0
  4. // LOOP_BEGIN:
  5. var i = 0
  6. LOOP_IF:
  7. if i < cnt { goto LOOP_BODY }
  8. goto LOOP_END
  9. LOOP_BODY:
  10. i = i+1
  11. result = result + vi
  12. vi = vi + step
  13. goto LOOP_IF
  14. LOOP_END:
  15. return result
  16. }

改动的部分:

  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

第三个代码段改为:

  1. #include "textflag.h"
  2. // func LoopAdd(cnt, v0, step int) int
  3. TEXT ·LoopAdd(SB), NOSPLIT, $0-32
  4. MOVQ $0, BX // result
  5. MOVQ cnt+0(FP), AX // cnt
  6. MOVQ v0+8(FP), DI // vi = v0
  7. MOVQ step+16(FP), CX // step
  8. LOOP_BEGIN:
  9. MOVQ $0, DX // i
  10. LOOP_IF:
  11. CMPQ DX, AX // compare i, cnt
  12. JL LOOP_BODY // if i < cnt: goto LOOP_BODY
  13. JMP LOOP_END
  14. LOOP_BODY:
  15. ADDQ DI, BX // result += vi
  16. ADDQ CX, DI // vi += step
  17. ADDQ $1, DX // i++
  18. JMP LOOP_IF
  19. LOOP_END:
  20. MOVQ BX, ret+24(FP) // return result
  21. RET

以上三个代码段其实是同一个程序的不同版本,他们的改动都是相同的问题。

3. ch1.1时间有错误

第1页:“到了2010年,Go语言已经逐步趋于稳定。同年9月,Go语言正式发布并开源了代码。”

其中2010改为2009.