Go语言自从发布以来就备受大家的关注和青睐。作者Rob Pike、Ken Thompson、Robert Griesemer是Unix、Plan 9等底层技术的领军人物,创建了很多经典的工具和语言。Go语言是在他们的经验和良心的基础上创建的,可以说是一门非常优秀的语言。
《Go语言圣经》被广泛认为是学习Go语言的入门书籍,但是它也是一本深入掌握Go语言的好书。那么本文就来谈一下《Go语言圣经》学习笔记,让大家更深入掌握这门语言。
1. 第2章:程序结构
我们知道,Go语言中只有一个main包,而且main包没有返回值。那么程序的返回值就由os.Exit函数决定。如果直接使用return语句,会返回0。但是如果和os.Exit合用,会导致程序不会有defer等退出前的操作。因此,如果需要在退出前执行defer等操作,一定要使用os.Exit函数。
2. 第3章:基本数据类型
Go语言中有两个基本的数值类型:整型(int)和浮点型(float)。在某些场合下,我们需要自定义数据类型,这就需要使用type关键字:
type Celsius float64 // 摄氏度
type Fahrenheit float64 // 华氏度
然后我们就可以使用上述自定义的数据类型进行计算,如下:
func CToF(c Celsius) Fahrenheit { return Fahrenheit(c*9/5 + 32) }
func FToC(f Fahrenheit) Celsius { return Celsius((f - 32) * 5 / 9) }
3. 第4章:复合数据类型
复合数据类型包括数组、切片、结构体和map。其中切片是Go语言中最重要的数据类型之一,它是一个动态数组。数组和切片的区别在于,数组有一个固定长度,而切片可以是任意长度。切片使用make函数创建:
s := make([]int, 0, 10)
其中第一个参数是切片的类型,第二个参数是切片的长度,第三个参数是切片的容量。
4. 第5章:函数
在Go语言中,函数也是一等公民。函数可以有多个返回值,也可以有可变长参数。下面是一个函数,它接受一个函数f和两个int类型参数,并返回一个bool类型的值:
func Do(f func(int, int) bool, a, b int) bool { return f(a, b) }
5. 第6章:方法
方法是Go语言中的一个特殊函数,它可以像C++或Java中的函数一样访问对象属性。下面是一个结构体和它的方法:
type Point struct{ X, Y float64 }
func (p *Point) ScaleBy(factor float64) { p.X *= factor; p.Y *= factor }
其中,第一个参数是接收者,它指定了方法所属的结构体类型和它的名字。
6. 第7章:接口
接口是Go语言中的一个非常重要的概念,它是一组方法的抽象。接口可以被任何实现了它的类型所实现。下面是一个接口:
type F interface { f() }
接口的一个重要使用场合是在文件读取和网络通信时,我们可以通过接口把文件或网络转换为统一的接口,这样就可以降低代码的耦合度。
7. 第8章:并发
最后一个章节是并发。Go语言本身天生支持并发,通过goroutine和channel可以构建其它语言无法实现的高并发程序。下面是一个并行计算的例子:
func main() {
n := 10
c := make(chan int)
for i := 0; i < n; i++ {
go func(i int) {
time.Sleep(time.Duration(i) * time.Second)
c <- i
}(i)
}
for i := 0; i < n; i++ {
fmt.Println(<-c)
}
}
这个程序创建了10个goroutine,每个goroutine都会等待一段时间,然后把自己的序号发送到通道中。主函数等待所有的goroutine结束后,从通道中读取数据并打印出来。
总结
通过上述的学习笔记,我们可以看到《Go语言圣经》一书涵盖了Go语言的方方面面,从程序结构到并发,从基本数据类型到复合数据类型和函数方法等,对Go语言进行了深入的介绍。阅读该书对于深入掌握Go语言有很大帮助,同时也可以为Go语言初学者提供足够的指导和帮助。