[ 后端2 | 青训营笔记]

49 阅读2分钟

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

一.并发操作

1.并发vs并行

  • 并行 : 两个或多个事件在同一时刻发生(多个线程在多核cpu上运行)
  • 并发 : 两个或多个事件在同一时间间隔发生(多个线程在单核cpu上运行)

2.协程vs线程

  • 协程 : 用户态,轻量级线程,栈Mb级别
  • 线程 : 内核态,线程跑多个协程,栈kb级别,操作比较废资源

3.开启协程

go+函数

 func main() {
     for i := 0; i < 5; i++ {
         go func(j int) {
             hello(j)
         }(i)
     }
     time.Sleep(time.Second)
 }
 func hello(i int) {
     println("hello:" + fmt.Sprint(i))
 }

4.CSP

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

5.Channel通道

通道就是goroutine(协程)之间的通道。它可以让goroutine之间相互通信。

实例:

 func main() {
     //创建两个通道
     src := make(chan int)
     dest := make(chan int, 3)
 ​
     //A子协程发送数组进通道
     go func() {
         //延迟关闭
         defer close(src)
         for i := 0; i < 10; i++ {
             //通道接收
             src <- i
         }
     }()
     //B子协程发送数字平方
     go func() {
         defer close(dest)
         for i := range src {
             dest <- i * i
         }
     }()
     //主协程输出最后的结果
     for i := range dest {
         println(i)
     }
 }

6.锁

实际工程中会出现并发安全问题,下面是锁的相关操作

 //定义锁
     var lock sync.Mutex
     
     lock.Lock()//加锁
     //执行操作
     lock.Unlock()//解锁

二.依赖管理

开发中的组件工具使用,通过sdk引入

项目依赖管理经过多次迭代

1.版本迭代

I.GOPATH

环境变量$GOPATH目录

  • bin : 项目编译的二进制文件
  • pkg : 项目编译的中间产物,加速编译
  • src : 项目源码

II.Go Vendor

通过每个项目引入一份依赖副本,所有依赖包副本形式放在$ProjectRoot/vendor下

解决了多个项目需要用到同一package依赖冲突问题

III.Go Module

通过go.mod文件管理依赖包版本

通过go get/go mod指令工具管理依赖

2.依赖管理三要素

  1. 配置文件,描述依赖------go.mod
  2. 中心仓库管理依赖------Proxy
  3. 本地工具--------go get/go mod

3.依赖选择

选择最低的兼容版本(即向后兼容)

4.依赖分发

通过Proxy实现依赖下载的稳定性,类似中转站,类似计算机中的内存

依赖下载从Proxy中下载

如果proxy中不存在就在原站中下载

三.测试

1.测试类型

  1. 回归测试
  2. 集成测试
  3. 单元测试

从上到下,覆盖率上升,成本下将

2.单元测试规则

  • 所有测试文件以_test.go结尾
  • 测试函数命名: func TestXxx(*testing.T)
  • 初始化逻辑放到TsetMain中

3.测试水平评估------代码覆盖率

运行 go test -cover

注:

  • 一般覆盖率在50%~60%
  • 测试分治相互独立,全面覆盖
  • 单元测试粒度足够小