Go 语言实战
最近由于需要从事 Go 语言相关的工作,为此花了约一个星期的时间将《Go 语言实战》这本书过了一遍,对 Go 语言有了一个基本的认识。这本书短小精悍,全书 200 多页,详细介绍了 Go 语言的数组、切片的底层原理,Go 语言的类型系统、并发、通道以及测试。当然部分内容也没有深入的讲解,如映射,其底层的实现介绍的不是很充分。《Go 语言实战》这本书适合有一定语言编程经验的读者。
之前只是知道在
import
包的时候可以使用_
来避免对于没有使用的包产生的编译时错误。但其实它还能做其他的处理,调用包提供的init()
函数进行初始化动作。所有的init()
函数都在main()
函数之前执行。深入理解了数组和切片之间的关系。切片的底层依然是数组,但是在 Go 语言中数组的大小是不变的,但切片就相对灵活多了,我们可以将切片看作是
(pointer, length, capacity)
的三元组,其中pointer
指向了底层数组的位置(当前切片在数组中的位置),length
则是当前切片中元素的个数,capacity
是切片的容量。我们可以在同一个数组上创建多个切片,但是要注意多个切片之前的操作可能导致数据错乱。例如:1
2
3arr := []int{1, 2, 3, 4, 5}
arr1 := arr[:4]
arr2 := arr[2:]当我们修改
arr2[0]
的时候,arr1[2]
的值也会相应的改变,这是因为他们底层共享同一个数组。切片在传递参数的时候要比数组的效率高很多。Go 语言通过接口来实现多态。
嵌入类型,这里涉及到嵌入类型方法的提升以及公开和未公开属性的相关内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25package 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"测试。测试部分包含单元测试、表组测试、模仿调用、测试服务端点。这些都给出来示例,指导我们如何编写可测试的代码。我们还可以通过
godoc
来为我们的包提供文档。后续还需要深入了解go test
相关的功能。
整本书的内容蛮多的,关于并发和并发模式,这部分只做了大概的了解,还没有深入的理解,尤其是第 7 章并发模式。
有人剃头于铺,其人剃发极草率,既毕,特倍与之钱而行。
异日复往,其人竭力为主剃发,加倍工夫,事事周到,既已,乃少给其资。
其人不服曰:“前次剃头草率,尚蒙厚赐,此番格外用心,何可如此?”
此人谓曰:“今之资,前已给过。今日所给乃前次之资也。”