第1章 关于Go语言的介绍
Go语言中没有继承,只有组合。
面向接口编程,编译器会判断一个类型的实例是否符合正在使用的接口。
duck type:不用显式声明实现了某个接口,只要实现了接口对应的那组行为即可。
第2章 快速开始一个Go程序
包名类似于命名空间。
map变量默认的零值是nil,只有调用make进行构造才能避免。
匿名函数:没有明确声明名字,可以接受声明时定义的参数。
访问文件时,相对路径是从项目根目录开始的,即,XX_proj/src中的xx_proj这一层。
命名惯例:如果接口类型只包含一个方法,那么这个类型的名字以er结尾。
WaitGroup,类似于Java中的CountLatchDown。
第3章 打包和工具链
支持远程导入,用go get命令来完成。
自带godoc命令,可以方便地搭建在线文档。
可以直接提取注释,生成文档。
go get不会指定获取依赖库的哪个版本。
gb通过vendor来管理依赖,可以摆脱对GOPATH的依赖。
第4章 数组、切片和映射
数组变量的类型包括数组长度和每个元素的类型,只有这两部分都相同的数组,才能互相赋值。
切片可以动态改变大小,当容量不够时,append函数将创建一个新的底层数组,把被引用的现有的值赋值到新数组里,再追加新的值。容量小于1000个元素时,总是成倍地增加;查过1000,则每次增加25%的容量。
切片共用同一个底层数组的特性需要注意,可能会在append时导致奇怪的错误。可以通过让新切片的容量和长度保持一致,令append强制创建新的底层数组,来避免这个问题。
切片和映射传递给函数时,不会复制底层的数据结构。
第5章 Go语言的类型系统
值接收者:支持指针和值调用
指针接收者:支持指针和值调用
Go语言中调用方法时,不必严格符合接收者的类型。
方法集:
如果调用方期望一个实现了某接口的值,则传入的类型在实现方法时,必须用值来作为接收者。
如果调用方期望一个实现了某接口的指针,则传入的类型在实现方法时,用值或者指针作为接收者均可。
内部类型提升:
如果外部类型没有实现同名方法,则内部类型实现的接口会自动提升到外部类型。
第6章 并发
goroutine在逻辑处理器上执行,而逻辑处理器具有独立的系统线程和运行队列。
竞态检测:go build -race。可以显示哪个goroutine引发了数据竞争,以及哪两行代码有冲突。
同步:原子函数和mutex;channel。
Channel:
无缓冲通道:如果发送goroutine和接收goroutine没有同时准备好,则先执行的goroutine会等待。
可以保证同时交换数据。
有缓冲通道:只有在通道中没有要接收的值时,接收动作才会阻塞。只有通道已满时,发送动作才会阻塞。
通道关闭后,仍然可以从里面取数据。
chan
第7章 并发模式
无缓冲通道:创建完成工作的goroutine池
有缓冲通道:管理一组可复用的资源
第8章 标准库
自带log包,基本上不用再考虑自己实现记录日志的功能了。
在调用函数后,判定返回值中的err是否为nil,是Go语言中常见的一种编程习惯。
第9章 测试和性能
mock:在测试没有所需的外部资源时,模拟这些资源的行为,使得测试能够正常进行。
在测试函数的开始声明一个匿名函数,其签名与待测试函数调用的资源保持一致。
godoc,可以生成交互式文档。
领取专属 10元无门槛券
私享最新 技术干货