这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、本堂课重点内容:
- 并发编程
- 测试
- 依赖管理
二、详细知识点介绍:
-
并发
-
并发与并行的概念
-
协程Goroutine
协程可以理解成轻量级的线程,与线程相比其开销更少。go协程运行在用户态,编程时使用
go关键字开启协程。 开启协程示例代码,协程分别打印:func HelloGoRoutine() { for i := 0; i < 5; i++ { //go关键字:开启协程 go func(j int) { println("hello goroutine : " + fmt.Sprint(j)) }(i) } //避免主线程先结束 time.Sleep(time.Second) } -
通道Channel
通道是实现协程间通信的一种方式,类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。go中“不要通过共享内存来通信,而应该通过通信来共享内存”。创建通道使用
make关键字,基本格式为a := make(chan 元素类型, [缓冲大小])。通道是一个传递数据的数据结构,通过传递指定类型的值来同步运行和通讯。将值传入通道可以使用
->,可以通过for range遍历通道中的内容。通道演示示例:
func CalSquare() { src := make(chan int) dest := make(chan int, 3) //A协程 go func() { //结束后关闭src defer close(src) //0-9加入src for i := 0; i < 10; i++ { src <- i } }() //B协程 go func() { defer close(dest) //获取src中的值,平方后加入dest for i := range src { dest <- i * i } }() //主线程遍历B协程处理结果(遍历dest中的内容) for i := range dest { println(i) } } -
锁Lock
可以通过锁实现同步,比如使用互斥锁
Sync.Mutex。sync包下有一个WaitGroup计数器,功能同javajuc中的计数器CountDownLatch。WaitGroup有3个方法,Add设置计数初始值、Done在某线程完成工作时将计数器-1、Wait是某个协程在计数器到达0前阻塞。
-
-
依赖管理
-
发展
GOPATH -> Go Vender -> Go Module
-
依赖分发(Go Module)
Proxy缓存依赖的各个版本,保证了依赖的稳定性。 -
工具(Go Module)
go get和go mod
-
-
测试
测试的质量某种程度上决定了代码的质量
- 单元测试
- Mook测试
- 基准测试
三、实践练习例子:
一个简单的可以查看上传文章的服务器,要了解需求分析、E-R图,用到了一个go框架——Gin
四、课后个人总结:
对go的并发编程和测试有了一定的理解,但对最后项目的实现流程有疑惑,目前也还没接触gin,感觉节奏有点快。
五、引用参考:
Go 语言进阶与依赖管理课程 juejin.cn/course/byte…
Go 语言工程实践之测试课程 juejin.cn/course/byte…