go 学习笔记

本文初始化于 2019-11-11 02:12:12,深夜开启学习 golang 的道路。

go 是静态类型的语言,入门推荐Go 编程语言指南
还有一个极客时间的课程示例代码

GOROOT GOPATH

  1. GOROOT:Go 语言安装根目录的路径,也就是 GO 语言的安装路径。
  2. GOPATH:若干工作区目录的路径。是我们自己定义的工作空间。 官方解释
  3. GOBIN:GO 程序生成的可执行文件(executable file)的路径。

命令源码文件

命令源码文件的用途是什么,怎样编写它?
命令源码文件是程序的运行入口,是每个可独立运行的程序必须拥有的。我们可以通过构建或安装,生成与其对应的可执行文件,后者一般会与该命令源码文件的直接父目录同名。
如果一个源码文件声明属于main包,并且包含一个无参数声明且无结果声明的main函数,那么它就是命令源码文件。
在同一个目录下的源码文件都需要被声明为属于同一个代码包。源码文件声明的包名可以与其所在目录的名称不同,只要这些文件声明的包名一致就可以。

库源码文件

库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话)。
第一条规则,同目录下的源码文件的代码包声明语句要一致。也就是说,它们要同属于一个代码包。这对于所有源码文件都是适用的。如果目录中有命令源码文件,那么其他种类的源码文件也应该声明属于main包。这也是我们能够成功构建和运行它们的前提。
第二条规则,源码文件声明的代码包的名称可以与其所在的目录的名称不同。在针对代码包进行构建时,生成的结果文件的主名称与其父目录的名称一致。对于命令源码文件而言,构建生成的可执行文件的主名称会与其父目录的名称相同。

数组 array

数组是连续存储在内存中的,每一个切片的底层实现都是绑定着一个数组。当切面的值改变时,底层数组也会跟着改变。当切片的 capacity 增大超过当前数组长度时,go 会自动产生一个新的底层数组,长度为以前的 2 倍,然后再绑定到切片上。当切片 capacity 大于 1000 时,底层数组的增长因子就会有 2 变为 1.25。数组的容量永远等于其长度,都是不可变的。

切片 slice

Go 语言的切片类型属于引用类型,同属引用类型的还有字典类型、通道类型、函数类型等;而 Go 语言的数组类型则属于值类型,同属值类型的有基础数据类型以及结构体类型。
注意,Go 语言里不存在像 Java 等编程语言中令人困惑的“传值或传引用”问题。在 Go 语言中,我们判断所谓的“传值”或者“传引用”只要看被传递的值的类型就好了。
如果传递的值是引用类型的,那么就是“传引用”。如果传递的值是值类型的,那么就是“传值”。从传递成本的角度讲,引用类型的值往往要比值类型的值低很多。
我们在数组和切片之上都可以应用索引表达式,得到的都会是某个元素。我们在它们之上也都可以应用切片表达式,也都会得到一个新的切片。切片的容量却不是这样,并且它的变化是有规律可寻的。用make函数初始化切片时,如果不指明其容量,那么它就会和长度一致。如果在初始化时指明了容量,那么切片的实际容量也就是它了。 切片代表的窗口是无法向左扩展的。
slice := make([]int, len, cap)

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
25
26
27
28
29
30
31
32
33
基于混合线程的并发编程模型自然不必多说。

在数据类型方面有:
基于底层数组的切片;
用来传递数据的通道;
作为一等类型的函数;
可实现面向对象的结构体;
能无侵入实现的接口等。

在语法方面有:
异步编程神器go语句;
函数的最后关卡defer语句;
可做类型判断的switch语句;
多通道操作利器select语句;
非常有特色的异常处理函数panic和recover。

测试 Go 程序的主要方式。这涉及了 Go 语言自带的程序测试套件,相关的概念和工具包括:
独立的测试源码文件;
三种功用不同的测试函数;
专用的testing代码包;
功能强大的go test命令。

Go 语言提供的那些同步工具。它们也是 Go 语言并发编程工具箱中不可或缺的一部分。这包括了:
经典的互斥锁;
读写锁;
条件变量;
原子操作。

以及Go 语言特有的一些数据类型,即:
单次执行小助手sync.Once;
临时对象池sync.Pool;
帮助我们实现多 goroutine 协作流程的sync.WaitGroup、context.Context;
一种高效的并发安全字典sync.Map。