Go 语言实战

最近由于需要从事 Go 语言相关的工作,为此花了约一个星期的时间将《Go 语言实战》这本书过了一遍,对 Go 语言有了一个基本的认识。这本书短小精悍,全书 200 多页,详细介绍了 Go 语言的数组、切片的底层原理,Go 语言的类型系统、并发、通道以及测试。当然部分内容也没有深入的讲解,如映射,其底层的实现介绍的不是很充分。《Go 语言实战》这本书适合有一定语言编程经验的读者。

  1. 之前只是知道在 import 包的时候可以使用 _ 来避免对于没有使用的包产生的编译时错误。但其实它还能做其他的处理,调用包提供的 init() 函数进行初始化动作。所有的 init() 函数都在 main() 函数之前执行。

  2. 深入理解了数组和切片之间的关系。切片的底层依然是数组,但是在 Go 语言中数组的大小是不变的,但切片就相对灵活多了,我们可以将切片看作是 (pointer, length, capacity) 的三元组,其中 pointer 指向了底层数组的位置(当前切片在数组中的位置),length 则是当前切片中元素的个数,capacity 是切片的容量。我们可以在同一个数组上创建多个切片,但是要注意多个切片之前的操作可能导致数据错乱。例如:

    1
    2
    3
    arr := []int{1, 2, 3, 4, 5}
    arr1 := arr[:4]
    arr2 := arr[2:]

    当我们修改 arr2[0] 的时候,arr1[2] 的值也会相应的改变,这是因为他们底层共享同一个数组。切片在传递参数的时候要比数组的效率高很多。

  3. Go 语言通过接口来实现多态。

  4. 嵌入类型,这里涉及到嵌入类型方法的提升以及公开和未公开属性的相关内容。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    package entities

    type user struct {
    Name string
    Email string
    }

    type Admin struct {
    user // 这是一个嵌入类型
    Level string
    }

    -----------------------------

    package main
    import (
    "path/to/user/entities"
    )
    a := entities.Admin{
    Level: "0",
    }

    // 设置未公开的内部类型的公开字段的值
    a.Name = "Bill"
    a.Email = "bill@example.com"
  5. 测试。测试部分包含单元测试、表组测试、模仿调用、测试服务端点。这些都给出来示例,指导我们如何编写可测试的代码。我们还可以通过 godoc 来为我们的包提供文档。后续还需要深入了解 go test 相关的功能。

整本书的内容蛮多的,关于并发和并发模式,这部分只做了大概的了解,还没有深入的理解,尤其是第 7 章并发模式。

笑林广记 - 先后

有人剃头于铺,其人剃发极草率,既毕,特倍与之钱而行。
异日复往,其人竭力为主剃发,加倍工夫,事事周到,既已,乃少给其资。
其人不服曰:“前次剃头草率,尚蒙厚赐,此番格外用心,何可如此?”
此人谓曰:“今之资,前已给过。今日所给乃前次之资也。”