Go语言工程实践 | 青训营笔记

123 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记 ~

1 语言进阶

并发编程、Go语言高性能的本质

并发:多线程程序在一个核的cpu运行

并行:多线程程序在多个核的cpu上运行

协程:用户态、轻量级、栈MB

线程:内核态、跑多个协程、栈KB级别

go语言创建协程、调用函数

go + 函数名

CSP

通过通信、共享内存

相当于消息队列

image.png

channel

关键字 make(chan 元素类型, [缓大小])

无缓冲通道 make(chan int)

同步通道

并发编程

设置lock

sync包下的一些关键字

2 依赖管理

不同环境(项目)依赖的版本不同

gopath(古老)

|- bin 编译的二进制文件

|- pkg 编译的中间产物,提速

|-src 项目源代码

直接依赖src下 的代码

go get下载最新的包到src下

无法实现多版本控制

go vendor

在项目目录下增加vendor文件,项目所有依赖包副本都放这

解决了多个项目需要同一个package依赖的冲突问题

缺点:出现不同依赖包的不兼容问题,无法控制依赖的版本

go module

通过 go.mod 文件管理依赖包版本

go mod init 初始化,创建 go.mod文件

go mod download 下载模块到本地缓存

go mod tidy 增加需要的依赖,删除不需要的依赖

中心仓库管理依赖库 Proxy【依赖分发】

通过 go get/ go mod 指令工具管理依赖包

语义化版本

基于commit

选择最低的兼容版本

image.png

v1.4兼容v1.3,这里最低的意思是,如果有v1.5,也还是选v1.4

测试

单元测试、质量意识

单元测试

规则

测试文件以 _test.go结尾

函数命名 func TestXxx

初始化逻辑放到 fun TestMain

单元测试例子

assert包

image.png

评估单元测试:代码覆盖率

image.png

因为score大于60,前两行被验证,return false没有,所以是 2/3,66.7%

较高覆盖率 80%+

一般覆盖率 50 - 60%

测试分支互相独立、全面覆盖

测试单元粒度足够小,函数单一职责

依赖的组件

数据库、cache、文件

目标

幂等:重复运行同一个,结果一样

稳定

Mock

如果涉及到外部依赖,运用mock测试

调用打桩函数,后面把这个卸载,unpatch

完全不依赖本地环境文件

基准测试

用本地测试,简便

fastrand随机场景

项目实战

项目需求

社区话题页面,展示话题、回帖列表

仅实现本地web服务,本地文件存储

分层结构

提高代码的可读性

例子:

数据层:屏蔽下游的数据差异

service:对数据层封装

组件工具

gin

go mod

go mod init (初始化)

go get

代码实现

定义索引,让表之间被发现

repository/db_init.go

初始化标题数据索引

打开文件,遍历,存储为结构体

xx索引

实现查询

topiconce适用于高并发

实现根据话题查询帖子

service逻辑层封装

并行

同时获取repository两个查询,获取话题数据

controller

定义错误、进行类型转换、创建page页面

Router搭建web框架

实现接口

运行测试

go run server.go

拿到jaison化的response,再渲染页面