Go语言进阶
这是我参加「第五届青训营」伴学笔记创作活动的第 2 天
语言进阶
-
Go语言很快,why?
- 并行:多线程程序在多个核CPU上运行
- 并发:多线程程序在单个核CPU上运行
- Go语言能充分发挥多核的优势
-
例子,快速打印出
hello goroutin:0 - hello goroutin:4package day2 import ( "fmt" "time" ) func hello(i int) { fmt.Println("hello goroutine : ", i) } func HellGoRoutine() { for i := 0; i < 5; i++ { go func(j int) { hello(j) }(i) } time.Sleep(time.Second) }代码并不是按照1 - 5的顺序逐个输出的,而是随机跳动的,说明程序是并行运行的
-
Go语言提倡通过通信来共享内存,而不是通过共享内存来实现通信
-
通道
make(chan, int)无缓冲通道,make(chan int, 2)有缓冲通道- 涉及操作系统中生产者消费者模型
-
并发安全
- 数据冲突
- 锁
lock sync.Mutex互斥锁来保护临界区
依赖管理
-
三要素
- 配置文件,描述依赖, go.mod文件
- 中心仓库管理依赖,Proxy代理
- 本地工具,go get/mod
-
项目不可能通过标准库来从零到一实现搭建
-
需要管理依赖库
-
已经存在的
-
GOPATH,不足是无法实现package的多版本控制
-
GO Vendor,不足:
- 无法控制依赖版本
- 更新项目可能有依赖冲突
-
GO Module:通过go.mod文件来管理依赖包的版本,类似于Java中的pom
-
-
依赖版本选择,会选择一个最低的兼容版本,也就是,在项目能运行的基础上,最低的一个版本
-
go mod工具
- go mod init 初始化
- download 下载模块到本地
- tidy 增加所需要的依赖,删除不需要的依赖
测试
-
质量就是生命
-
测试就是保证质量的手段,尽可能的避免事故
-
大致的三种类型,从上到下,覆盖逐渐变大,成本逐渐变低
- 回归测试
- 集成测试
- 单元测试
-
规则
- 所有测试文件,以
_test.go结尾 - 所有方法,
func Testxxx(t *testing.T) - 初始化逻辑,放在
TestMain中
- 所有测试文件,以
-
单元测试工具,assert 包
-
覆盖率工具
JudgePassLine(score int)简单地判断覆盖率
项目设计思路
需求设计
需求描述(你想实现怎样的效果)
- 名称:社区话题界面
-
功能
- 展示话题(标题+文字描述)和回帖列表
- 仅仅是先web服务端,暂时不考虑前端
- 话题和回帖暂时用文件存储
需求用例(都有哪些人,对哪些事物,做了哪些事情)
- 用户
- 话题页面
- 发帖列表
ER图设计(事物之间具体的关系是什么)
分层结构
- 数据层,也就是模型和数据库,外部数据的curd
- 逻辑层,也就是业务层,核心业务的逻辑输出,Service
- 视图层,Controller,处理交互
工具
- Gin 高性能GoWeb框架
- Go Mod