这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
知识要点:
- 语言进阶
从并发编程的视角待大家了解Go高性能的本质。
- 依赖管理
了解GO语言依赖管理的演进路线。
- 测试
从单元测试实践出发,提升大家质量意识。
- 项目实战
通过项目需求,需求拆解,逻辑设计,代码实现代领大家感受真实的项目开发。
二、详细知识点介绍
1.语言进阶
并发VS并行
并发
并发是多线程程序在同一个CPU上运行,并且通过时间片切换实现并发
并行
并行是多线程程序在多个CPU上运行
Goroutine
协程相当于轻量级线程
线程:轻量级线程,栈MB级别。 协程:线程跑多个协程,栈KB级别。 内核态的权限比用户态大,访问得到的资源更多,安全性更高,但是维护起来也更复杂
个人总结
用户态线程和内核态线程,参考以下链接
粗略的可以把在用户调用API的称为用户态线程,内核执行API的称为内核态线程。
Channel
生产者生产较快所以用不带缓冲的channel 消费者消费过慢所以用带缓冲的channel 特点: 无缓冲信道 Channel 是无法保存任何值的,该类型信道要求 发送 goroutine 和 接受 goroutine 两者同时准备好,这样才能完成发送与接受的操作。 所以消费者需要带缓冲来保存值。
Lock
Lock保证并发安全,不会对一个数据进行多次add。
lock.Lock()
× += 1
lock.Unlock()
WaitGroup
计数器:开启协程+1;执行结束-1;主协程阻塞直到计数器为0,由此来推断是否协程已经执行完毕。
2.依赖管理
GOPATH -> GO VENDER -> GO MODULE
3.测试
测试从上至下分为回归测试,集成测试,单元测试。 从上至下的覆盖率逐渐变大,成本却逐渐降低。 单元测试可以精确到每一个函数去进行测试,这个是测试过程中非常重要的一步。
4.项目实践
话题消息和回帖消息是互不影响的所以这两个可以并行
func (f *QueryPageInfoFlow) prepareInfo() error {
//获取TOPIC消息
var wg sync.WaitGroup
go func() {...}()
//获取POST列别
wg.Wait
return nil
三、引用参考
到底什么是用户态线程,内核态线程?
Go 语言中的带有缓冲 Channel(Let‘s Go 三十一)