这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记。
本节课前对go语言的语法有了初步了解。但是go为什么这么快呢?
在go语言中,可以充分发挥多核cpu的优势,高效运行,在多个核的cpu上运行,形成并行运行。并行是实现并发的一种手段。Go语言则实现了并发性能极高的一种调度模型,充分利用多核的能力来提升速度。
内核的创建、切换、停止在系统中占用的资源很多,是栈MB级别的。而协程是轻量级线程,线程可以并发运行多个协程。例如:希望实现快速打印数据,就可以打开多个协程来提升效率。如:在调用函数前加入go,则可打开协程,来并行打印输出,且为乱序。
通常可通过通信来共享内存或通过共享内存来实现通信。Go中协程中通过通信来共享内存。从一个goroutine来发送值到通道,再从通道发送到其他goroutine。在这两种通信中,提倡使用通过通信来共享内存的方法来提升效率。
创建通道(channel):使用make创建。make(chan 元素类型,[缓冲大小])。缓冲大小是指通道中可以存放多少个数据。其中无缓冲通道也被称为同步通道。通道满了的时候只能等待通道中的信息被传输过去后才能再向通道传递信息。向协程中发送信息以及两个通道之间的传输信息可以使用<-来实现。
在并发时可以使用并发安全锁Lock。在操作时先使用lock.Lock(),再使用lock.Unlock()。通过Lock的使用可以确保并发安全。
GOPATH 弊端:无法实现package版本的不同控制。可以在项目目录下增加vendor文件,里面存放依赖包副本形式,首先在vendor中寻找package的各种版本,最后在GOPATH中寻找版本来解决这个弊端。但vendor也有相应的弊端。为了解决它,可通过go.mod文件管理依赖包版本,通过go get或go mod指令工具管理依赖包。以此定义版本规则和管理项目依赖关系。
依赖管理三要素:配置文件go.mod、中心仓库管理依赖库Proxy、本地工具go get /mod。其中配置文件用来描述依赖了什么包,包是如何唯一定位的。在依赖的版本选择上,会默认选择最低的兼容版本。
测试分回归测试、集成测试、单元测试。从前到后覆盖率逐渐增大,成本降低。
defer为延迟的资源关闭。