最近基本看完了《Go语言编程》, 总得感觉还不错, 比较适合Go语言初学者.

书中有几个地方描述的可能不太准确,列下来和大家讨论。

0. 6页 1.2.4 错误处理

3个关键字为defer、panic和recover。

panic和recover 并不是关键字,而是内置函数。

参考Go Spec 的 Keywords:

break        default      func         interface    select
case         defer        go           map          struct
chan         else         goto         package      switch
const        fallthrough  if           range        type
continue     for          import       return       var

Go有很多内置函数和类型,具体参考builtin包。 比如可以将bool等内置类型用作一个普通变量:

bool := 10
fmt.Printf("bool = %v\n", bool)

输出: bool = 10

1. 21页 2.1.2 变量初始化

var v1 int = 10
var v2 = 10
v3 := 10

书中说3种用法完全一样其实并不准确。

查看Go spec的 “Short variable declarations” 描述:

Short variable declarations may appear only inside functions.

第三种用法只能在函数内部使用。

另外,后面的 “出现在:=左侧的变量不应该是被声明过的,否则会导致编译错误” 也不太准确。

因为,根据spec描述,左边至少要有一个新的变量(不含_),被被声明过的其他变量会被重复被声明过。 比如:

field1, offset := nextField(str, 0)
field2, offset := nextField(str, offset)  // redeclares offset

2. 24页 2.2.4 枚举

书中提到一个常规的枚举表示法,定义一些列常量:

const (
    Sunday = iota
    Monday
    Tuesday
    Wednesday
    Thursday
    Friday
    Saturday
    numberOfDays
)

其实,这里只是定义了一组常量,并不是枚举类型,它们和以下代码等价:

const (
    Sunday = 0
    Monday = 1
    Tuesday = 2
    Wednesday = 3
    Thursday = 4
    Friday = 5
    Saturday = 6
    numberOfDays = 7
)

3. 33页 2.3.8.1 创建数组切片/基于数组

“甚至可以创建一个比所基于的数组还要大的切片” 说法不准确。

如果切换超出数组的范围:

myArray := [5]int{1,2,3,4,5}
mySlice := myArray[1:6]
fmt.Printf("mySlice = %v\n", mySlice)

运行时会抛出异常:slice index out of bounds

4. 39页 2.4 流程控制

关于条件语句的最后一个注意点: 在有返回值的函数中,不允许将“最终的” return 包含在 if/else 中, 否则会编译失败。

如果末尾加 panic 的话,可以正常编译。

func example(x int) int {
    if x == 0 {
        return 5
    } else {
        return x
    }
    panic("")
}

注: Go1.1已经修复了该问题.

5. 63页 3.1 类型系统 3.1.1 类型系统

“在需要的时候,你可以给任何类型(包括内置类型)‘增加’新方法。”

“在Go语言中,你可以给任意类型(包括内置类型,但不包括指针类型)添加相应的方法”

“可以给任意类型添加相应的方法” 是不允许的!

查看 Go Spec 的 Method declarations 一节描述:

The type denoted by T is called the receiver base type; … and it must be declared in the same package as the method.

类型的方法必须和类型的定义在同一个包内。因此,无法在包外给一个类型增加方法(包括内置类型)。


当然,书中的很多内容还是很好的,我比较喜欢 “面向对象编程/并发编程/进阶话题” 等内容。

补充:

以上都是第一版中存在的, 新版本中应该已经修复了. 感谢 许大 送的签名版《Go语言编程》.