GoLang
这是我参与「第五届青训营 」伴学笔记创作活动的第2天
语言特性要点
Goroutine -- 协程,超轻量的用户态实现“线程”
goroutine的实现是go能够在高并发下保持良好运行的核心。这里有个需要特别注意的点,概念上协程的实现实际上是单核的分时调用,但是协程的体量小(一般几KB,相对比线程一般要到MB的量级),所以上下文切换的速度快,而且是完全的用户空间的实现,不必陷入内核态,可以快速的在大量协程间切换,完成高并发的任务。
但是本质上协程的实现方式是单线程的,单个协程的阻塞会导致整个任务的阻塞,go的底层在调度上做了很多的处理,来避免出现这种情况,有待进一步深入学习go的底层调度算法。Channel -- go的通信哲学:“主动协商”代替“盲目争夺”
channel的出现实际上一种协程间高效传递信息的机制,相比处理复杂的竞态资源分配,经过高效设计的channel极大的减轻了bug出现的几率,使用起来十分顺手,使用channel编程的模型大多数是操作系统课程中处理资源共享章节的经典模型,包括购买者-消费者模型等。
Sync -- 对于经典的支撑
但是go没有完全放弃经典的资源共享模型,今天学到的“Lock”操作和waitgroup类的同步功能都是对于经典操作的支持,与C++的部分操作在思想上基本一致。
Go与软件工程
go在语言层面给予了软件工程在实践上的极大支撑
环境管理
go的项目环境管理经历了多次迭代,随着go的发展,简单的GOPATH(基本的多版本包控制都做不到)很显然无法满足大型项目的复杂的包依赖关系,因此先后发展出vendor(无法处理对不同版本不兼容的包依赖关系)和Module, 由于1.11版本后go全面拥抱Module的包管理方式,因此前两种只做简单了解。
Module能够实现的三要素如下: 1.本地配置文件,描述依赖 go.mod文件,1.15后还包括为了一致性和安全性引入的go.sum文件,具体go.mod文件的配置方式和语义语法等内容不赘述 2.中央仓库管理依赖库,这里实际上go没有真正的中央仓库,而是使用了托管仓库+GOPORXY来实现中央仓库的功能 3.本地的工具,go get/mod 都是实现Module包管理功能必不可少的一部分单元测试
go在单元测试上,从语言层面为开发人员给予了极大的支持,便捷的测试方式带来了测试Java代码的流畅体验。重要的几点:测试覆盖率在主分支中至少要到50%,优秀的可以做到80%,这已经能避免在大多数场景下可能出现的问题。同时Mock测试,通过“打桩”这一操作,支持项目的迁移测试,让测试环境不必受限于测试的外源性输入,提升测试的效率,但是也对开发人员有一定的高要求。最后老师提到了BenchMark测试,对benchmark在语言层面上的支持,能够方便的分析大型项目的性能瓶颈,这里老师还特意提到了fastrand包,牺牲部分的随机性,替换rand包来极大提升并行的benchmark。
项目设计与技术点
(go语言无关)分层结构设计
由于项目本身的简单性,老师在设计采用了经典的Model-Entity- View分层结构设计,其中E-R图的设计等都是相对比较基础的。 技术点:
Web框架--Gin 数据存取操作 文件读写操作 上面的技术点的基本思想都和SpringBoot下的Java类似不赘述参考
掘金字节内部课:后端入门 - Go 语言原理与实践