Go语言入门 - 工程实践 笔记| 青训营笔记

192 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

前言

这节课,青训营老师主要分享了四个部分知识

  1. 从并发角度理解Go高性能本质
  2. Go依赖管理
  3. Go测试

本文仅用于笔者自己进行知识巩固

并发编程

Goroutine

golang 推荐协程而不是线程,两者的区别

  • 协程:用户态,轻量级线程、栈KB级别
  • 线程:内核态、线程跑多个协程,栈MB级别

CSP

Communicating Sequential Processes

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

这句话有一点点抽象,我的理解是 golang 提倡使用通信的方式让协程之间达到共享内存的效果,而不是通过访问共享内存的方式实现通信

image.png


Channel

golang 基于上面的思想推出的数据通道,通过Channel进行通信从而实现共享内存的效果

其中包括有缓冲通道和无缓冲通道

无缓冲通道就是阻塞通道,有缓冲通道通过缓冲,让发送方不必阻塞等待调用方调用,减少了阻塞次数


WaitGroup

当一个协程需要等待多个协程运行结束后才能进行下一步操作的时候

我们可以使用Channel来进行通信达到效果,但未免让人觉得有些浪费了

golang 标准库sync包中的提供了任务队列WaitGroup,用于阻塞当前协程,直到等待任务数清零

其实就是一个等待任务的计数器

主要函数

  • WaitGroup.Add(n int): 添加数字,标识需要等待的任务数
  • WaitGroup.Done(): 调用表示一个被等待的任务已经执行完毕 (看源码,本质就是Add(-1))
  • WaitGroup.Wait(); 调用者会阻塞等待当前WaitGroup中任务数清零再开始下一步操作

依赖管理

go的依赖管理,到1.18版本,已经经历了三次变更

分别是Go Path、Go Vendor、Go Module


go path

golang 提供的配置在环境变量中的属性,项目中的依赖直接下载到该path下中的src文件夹中,

弊端在于没有版本的管理概念,如果引用了不同的依赖版本没有办法管理


go vender

golang 后来提供在项目目录下增加vendor文件夹,可以把所有的依赖包以副本的形式放进该文件

解决了多个项目引用同一个包出现的各种冲突问题,但是仍然没有解决同一个项目依赖不同版本的问题


Go Module

golang 推出的最新的依赖管理方案,解决了同一个项目引用不同依赖同一个包不同版本的问题

也满足了市面上主流依赖管理工具的绝大多数功能,以后学习管理依赖的工具直接使用Go Module即可

依赖管理三要素

  1. go.mod:配置文件。描述依赖
  2. Proxy:代理镜像地址,存储着中心仓库的副本,如果没有会从中心仓库下
  3. go get/mod:本地工具,用于获取需要的依赖

常用配置项

  1. -version

    • 支持语义化版本(如v1.3.0)
    • 支持commit伪版本(如 v0.0.0-20220401081311-c38fb59326b7)
  2. -indirect:表示该依赖没有被直接依赖,而是间接依赖(依赖的依赖)


测试

做过线上业务的同学应该知道 “敬畏线上” 的重要性

所以对于很多接口的编写,在开放使用之前一定要经过充分的测试

golang 标准库提供了testing包,可以支持单元测试,基准测试

同时为了减少测试对实际资源的影响,我们还可以使用第三方库对调用资源进行mock(比如开源的monkey包)

具体的测试编写细节,可以根据这篇文章学习,本文就不做赘述了

后续的文章也会引入golang中重要的性能评测工具pprof,结合单元测试和基准测试进行性能调优,尽情期待

小结

本文简单介绍了并发编程,依赖管理,还有测试的部分知识

在掌握golang基础语法的基础上,如果你也掌握了上述内容,那么就可以开始实际业务代码的编写了

你已经具备了编写业务代码的知识广度,至于深度,恰恰需要在实践中边打边磕磕绊绊,边深入研究

前两天在群里看到一位大佬说的话,我结合自己的想法说说:

对于实践性比较强的东西,先不要直追原理死啃,先快速上手,不管三七二十一先用上再说,

后面踩坑了再深入的去学,这样你的知识有实际的问题场景做支撑,将会比书上来的更扎实

至少我浅薄的知识有不少是来源于此,与诸君共勉