GO——工程实践

66 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天

语言进阶

go可以充分发挥多核优势,高效运行。
1,多线程程序在一个核的cpu上运行。
2,多线程程序在多个核的cpu上运行。
协程:用户态,轻量级线程,栈MB级别。
线程:内核态,线程跑多个协程,栈KB级别。
CSP:提倡通过共享内存而不是通过共享内存而实现通信。
Channel:make(chan元素类型,【缓冲大小】)
并发安全:Lock

依赖管理

开发包。
gopath--govendor--gomodule

gopath

弊端:无法实现package的多版本控制。

govendor

项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
依赖寻址方式:vendor->GOPATH
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
弊端:无法控制依赖的版本,更新项目又可能依赖冲突,导致编译错误。

gomodule

通过go.mod文件管理依赖包版本。
通过go get/go mod指令工具管理依赖包。
目标:定义版本规则和管理项目依赖关系。

依赖分发

回源

弊端:无法保证构建稳定性;无法保证依赖可用性;增加第三方压力。

Proxy

配置:GOPROXY="URL,URL,direct"

工具

go get

go get example.org/pkg

@update 默认
@none 删除依赖
@v1.1.2 tag版本,语义版本
@23dfdd5 特定的commit
@master  分支的最新commit

go mod

go mod

init 初始化,创建go.mod文件
download 下载模块到本地缓存
tidy 增加需要的依赖,删除不需要的依赖。

依赖管理三要素: 1,配置文件,描述依赖。go.mod
2.中心仓库管理依赖库。Proxy
3.本地工具。go get/mod

测试

单元测试,集成测试,回归测试。从右到左,覆盖率依次变大,成本依次降低。

单元测试

输入,测试单元(函数,模块),输出,校对(输出和期望校对)。
保证质量,提升效率。

规则

所有测试文件以_test.go结尾;
func TestXxx(*testing.T);
初始化逻辑放到TestMain中

覆盖率

一般覆盖率:50%~60%。
测试分支相互独立,全面覆盖。
测试单元粒度足够小,函数单一职责。

Mock

monkey:github.com/bouk/monkey… 快速Mock函数:
为一个函数打桩.
为一个方法打桩。
func Path(){};func Unpath(){}

项目实战

流程:需求描述---需求用例---ER图---分层结构

需求用例

浏览消费用户:topic,postlist(实体),(属性)id,title,content,create_time;id,topic_id,content,create_time(E-R图).topic和postlist关系:一对多。
分层结构:
数据层:数据Model,外部数据的增删改查;
逻辑层:业务Entity,处理核心业务逻辑输出;(分装,打包出实体)
视图层:视图view,处理和外部的交互逻辑。
数据层面向的是逻辑层。逻辑层需要拿到数据层返回的数据。\