这是我参与「第五届青训营」伴学笔记创作活动的第 2 天。
课堂笔记
一、本堂课重点内容:
- go语言进阶
- go语言依赖管理
- go语言测试
- go语言项目实战
二、具体案例:
1. go语言进阶
-
并行与并发
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
-
Goroutine
线程:用户态,轻量级线程,栈MB级别。
协程:内核态,线程跑多个协程,栈KB级别。
package main
import (
"fmt"
"time"
)
func hello1(i int) {
fmt.Println("hello goroutline:" + fmt.Sprint(i))
}
func main() {
for i :=0; i<5 ; i++{
go func(j int) {
hello1(j)
}(i)
}
time.Sleep(time.Second)
}
-
CSP
提倡通过通信共享内存而不是通过共享内存而实现通信
-
Channel
make(chan元素类型,[缓冲大小]).
无缓冲通道:make(chan int)
有缓冲通道:make(chan int,2)
-
并发安全Lock
使用lock sync.Mutex实现互斥访问
-
WaitGroup
Add()开启协程+1参数里面填的协程数;
Done()执行结束-1,完成一次协程数量减一;
Wait()主协程阻塞直到计数器为0。
2. go语言依赖管理
2.1 GO依赖管理演进
-
GOPATH
弊端:无法实现package的多版本控制
-
GO Vendor
无法控制依赖的版本
更新项目有可能出现依赖冲突,导致编译出错
-
GO Module
通过go.mod文件管理依赖包版本
通过go get/go mod指令工具管理依赖包
2.2 依赖管理三要素
1.配置文件,描述依赖 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
3.项目测试
3.1 回归测试
一般是手动通过终端回归一些固定的主流程场景
3.2 集成测试
对系统功能维度做测试验证
3.3 单元测试
测试开发阶段,开发者对单独的函数、模块做功能验证
-
规则:所有测试文件以_test.go结尾
func TestXxx(*testing.T)
初始化逻辑放到TestMain中
-
覆盖率:用来衡量项目的测试水准及等级,具体就是测试对应函数,其中函数里执行的代码行数除以总代码的行数,assert.Equal会自动计算
- Mock函数
4.go语言项目实战
4.1 需求描述(社区话题页面)
- 展示话题(标题,文字描述))和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储
4.2 需求用例
-
浏览消费用户
4.3 E-R图
- 话题
- 帖子
4.4 分层结构
-
数据层:数据Model,外部数据的增删改查
-
逻辑层:业务Entity,处理核心业务逻辑输出
-
视图层:视图view,处理和外部的交互逻辑
4.5 组件工具
- Gin高性能go web框架
- Go Mod
4.6 项目代码及结果
项目get请求结果
三、课后个人总结
今天直接进入了项目的基础架构,对项目测试理解更加透彻了,讲了很多关于go语言性能上面的优点,以及自我感觉很好,期待后期课程