这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
- 本文为青训营课程笔记,配合原课程食用效果更佳哦~(也可以转成思维导图食用)
课程笔记
-
语言进阶
-
多线程(go为协程kb级别,所以甚至可以开上万)
-
方式go func(){} (parms)(猜测func(){}为匿名函数)
-
chan类型(channal通道),用于收发数据,建议的线程间共享数据方式
- 可设置缓冲区 c := make(chan, valueType, [size])
-
也可通过共享内存来实现数据共享,加锁机制
-
lock = sync.Mutex声明变量
- Lock()函数加锁,Unlock()释放锁
-
-
WaitGroup阻塞
-
WaitGroup方法:
- Add(delta int)增加delta个计数
- Done()减少一个计数
- Wait()阻塞直到计数为0
-
功能
- 可令delta为线程数,执行完成Done(可用defer)
- 最后Wait()即可在此时达成同步,就不用Sleep
-
-
-
依赖管理
-
GOPATH
- 直接get到src中:无法多版本控制
-
Go Vendor
- 为依赖包创建副本在vendor文件夹下:版本不兼容问题
-
Go Module
-
配置go.mod,设置中间仓库Proxy
-
版本
-
语义化版本
${MAJOR}.${MINOR}.${PATCH}- V1.3.0
- V2.3.0
-
基于 commit 伪版本
vX.0.0-yyyymmddhhmmss-abcdefgh1234- v0.0.0-20220401081311-c38fb59326b7
- v1.0.0-20201130134442-10cb98267c6c
-
-
标记
- // indirect标记间接依赖
- +incompatiable标记没有go.mod可能不兼容
-
选择版本应该为能兼容的最低版本
- 如要求1.3、1.4,那么选择1.4
- 2.x不能选,主版本可能会不兼容
- 1.5不能选,违背“最低版本”
- 1.3不能选,不兼容1.4
- 不过也不会分开来按需选择调用1.3/1.4
-
proxy作为中间仓库,优先在此查找依赖,无则源站点
-
go get命令
- @update 默认
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支的最新commit
-
go mod命令
- init 初始化,创建go.mod文件
- download 下载模块到本地缓存
- tidy 增加需要的依赖,删除不需要的依赖
-
-
-
测试
-
单元测试
-
命名:"对应文件名"+"_test"(.go),TestXXX,TestMain
-
测试
- 直接!=判断
- 导入"github.com/stretchr/testify/assert","test":assert.Equal(t, false, isPass)
-
覆盖率:尽可能测试到所有条件分支,代码覆盖率可一定程度反映
-
Tips:
- 一般覆盖率:50%~60%,较高覆盖率80%+。
- 测试分支相互独立、全面覆盖。
- 测试单元粒度足够小,函数单一职责。
-
-
Mock测试
打桩:解决依赖问题
- patch(f1,f2):f1被换成f2(更改函数地址)
- unpatch(f1):换回来
-
基准测试
测试性能(fastrand快速随机数,否则随机数卡性能)
- InitServerIndex()初始化
- b.ResetTimer()重置时间
- b.RunParallel(func……)运行……
-
-
项目实战
-
需求分析
-
ER图(Entity Relationship Diagram)
-
分层
- 数据层:数据 Model,外部数据的增删改查
- 逻辑层:业务 Entity,处理核心业务逻辑输出
- 视图层:视图 view,处理和外部的交互逻辑
-
具体
- 查询使用map
- service校验参数-准备数据-组装实体 (注意if err…return)
- 实现参见源代码
-
流程小结
- 项目拆解
- 代码设计
- 测试运行
-
总结收获
通过样例与知识点结合的方式,学到了go的强大并发支持;
通过项目样例的讲解,更了解了一个项目的诞生过程;
又是收获满满的一天,一起加油吧