《GO语言实战》笔记
数组、切片和映射
- 从内存和性能来看,在函数间传递数组是一个开销很大的操作,因为总是以值传递的方式进行的。无论一个数组有多长,总会完整复制并传递给函数。
- //创建容量长度都是100的切片
slice := []string{99: “”}
如果在[]运算符里指定了一个值,那么创建的就是数组而不是切片。 - var slice []int // 创建nil整型切片
slice := make([]int, 0) slice := []int{} // 创建空切片
两者长度、容量都为零,前者的指针是nil,后者的指针是一个地址,但是没有分配任何存储空间。 - slice[i:j:k] -> len = j - i; cap = k - i
- 在创建切片时设置切片的容量和长度一样,可以强制让新切片的第一个append操作创建新的底层数组,与原有的底层数组分离,可以安全地进行后续修改。
- map键值可以为任意能用==比较的类型。切片、函数、包含切片的结构类型不能作为键值。
- colors := map[string]string{} // 空映射
var colors map[string]string // nil映射
当使用colors[“red”] = “#da1337” 进行赋值时,由于nil映射不能用于存储键值对,会产生一个语言运行时错误。 - 在函数间传递map不会制造出一个副本,当传递一个map给函数,并在函数中进行修改时,所有对这个map的引用都会察觉到这个修改。
Go语言的类型系统
- 如果在不同行声明每个字段的名字及对应的值,最后一行也要以逗号结尾,且对字段的声明顺序没有要求;如果声明在同一行,则顺序要与结构体定义的顺序一致,且末尾不需要逗号。
- Go语言的引用类型有:slice、map、channel、interface、func.
- 当包内一个标识符的名字以小写字母开头时,这个标识符就是未公开的,即包外的代码不可见。(类似于私有成员变量)通过公开的函数来访问,然后用:=有能力捕获引用的类型来创建一个未公开的类型的变量。
并发
- atomic.AddInt64(&counter,1) // 强制同一时刻只能有一个goroutine运行并完成这个加法操作。(原子函数)
- mutex互斥锁用于在代码上创建一个临界区,保证同一时间只有一个goroutine可以执行这个临界区代码。