GO语言进阶 | 青训营笔记

172 阅读2分钟

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

一、本堂课重点内容:

知识要点:

  1. 语言进阶

从并发编程的视角待大家了解Go高性能的本质。

  1. 依赖管理

了解GO语言依赖管理的演进路线。

  1. 测试

从单元测试实践出发,提升大家质量意识。

  1. 项目实战

通过项目需求,需求拆解,逻辑设计,代码实现代领大家感受真实的项目开发。

二、详细知识点介绍

1.语言进阶

并发VS并行

并发

并发是多线程程序在同一个CPU上运行,并且通过时间片切换实现并发 image.png

并行

并行是多线程程序在多个CPU上运行

Goroutine

协程相当于轻量级线程

线程:轻量级线程,栈MB级别。 协程:线程跑多个协程,栈KB级别。 内核态的权限比用户态大,访问得到的资源更多,安全性更高,但是维护起来也更复杂

个人总结

用户态线程和内核态线程,参考以下链接

www.zhihu.com/question/32…

粗略的可以把在用户调用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

三、引用参考

到底什么是用户态线程,内核态线程?

www.zhihu.com/question/32…

Go 语言中的带有缓冲 Channel(Let‘s Go 三十一)

blog.csdn.net/coco2d_x201…