Go高级编程与项目实战 | 青训营笔记

58 阅读2分钟

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

本节课程主要分为四个方面:

  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战

1.    从go并发编程视角了解Go的高性能本质

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

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

GO实现了一个高效的调度模型,可以充分发挥多核优势,高效运行。

协程:goroutine,用户态,轻量级线程,栈KB级别;

线程:比较昂贵的系统资源,内核态,线程跑多个协程,栈MB级别。

协程间通信(CSP):

Go提倡通过通信共享内存而不是通过共享内存而实现通信

image.png

通道:channel,类似于传输队列,先入先出

通过共享内存通信需要互斥量加锁

 

通道:channel

make(chan 元素类型,[缓冲大小])

无缓冲通道:make(chan int),同步通道

有缓冲通道:make(chan int, 2)

 

WaitGroup:实现并发任务的同步,因为time.Sleep方法并不能确定子协程结束的时间

Add(delta int):计数器+delta

Done():计数器-1

Wait():阻塞直到计数器为0

2.    依赖管理

环境变量$GOPATH:

bin:项目编译的二进制文件

pkg:项目编译的中间产物,加速编译

src:项目源码

 

GoVendor:项目目录下增加vendor文件夹,所有依赖包副本形式放在$ProjectRoot/vendor下

依赖寻址:vendor -> gopath

 

Go Module:通过go.mod文件管理依赖包版本,通过go get/go mod 指令工具管理依赖包。

 

依赖管理三要素:

1、  配置文件,描述依赖 go.mod

2、  中心仓库管理依赖库 Proxy

3、  本地工具 go get/mod

 

indirect:间接依赖

incompatible:不兼容的

image.png

工具:Go mod

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

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

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

 

3.    测试

image.png 回归测试:QA同学手动在终端回归场景来测试

集成测试:自动化的在功能维度对暴露的接口进行回归测试

单元测试:

规则:

l  所有测试文件以_test.go结尾;

l  测试函数:func TestXxx(*testing.T)

l  初始化逻辑放到TestMain中:func TestMain(m *testing.M){

       //测试前:数据装载、配置初始化等前置工作

       code := m.Run()

       //测试后:释放资源等收尾工作

       os.Exit(code)

}

 

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

 

幂等:重复执行一个case结果都是一样的

4.    项目实战

4.1 需求描述

image.png

4.2 需求用例

1、浏览消费用户

image.png

Topic:话题

PostList:帖子

4.3 E-R图

image.png

4.4 分层结构

image.png

视图层相当于对返回数据做一层包装。

 

项目源码:github.com/Moonlight-Z…