Go语言进阶与依赖管理 | 青训营笔记

74 阅读1分钟

Go 语言进阶与依赖管理

01.语言进阶

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

1.1 Goroutine

协程: 用户态, 轻量级线程, 栈 KB 级别

线程: 内核态, 线程跑多个协程, 栈 MB级别

Go语言调用协程十分简单, 只需要在函数前加上 go

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

1.2 CSP (Communicating Sequential Processes)

Go语言提倡通过通信共享内存而不是通过共享内存而实现通信

1.3 Channel

make (chan 元素类型, [缓冲大小])

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int, 2)

02.依赖管理

了解Go原因依赖管理的演进路线

  • 工程项目不可能基于标准库0 ~ 1编码搭建
  • 管理依赖库

2.1 Go依赖管理演进

GOPATH -> Go Vendor -> Go Module

  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本

依赖分发-回源

  • 无法保证构建稳定性

    • 增加/修改/删除软件版本
  • 无法保证依赖可用性

    • 删除软件
  • 增加第三方压力

    • 代码托管平台负载问题

变量 GOPROXY

 GOPROXY="https://proxy1.cn,https://proxy2.cn,direct"

服务器站点URL列表, "direct"表示源站

优先从Proxy1中查找, 没有则到Proxy2中查找, 再没有就会到源站Direct中查找

总结: 依赖管理三要素

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

03.测试

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

测试分为三层 回归测试 -> 集成测试 -> 单元测试

从左到右, 覆盖率逐渐变大, 成本却逐渐降低

单元测试-规则

  • 所有测试文件以 _test.go 结尾

  • func TestXxx(*testing.T)

  • 初始化逻辑放到 TestMain 中

    • 测试前: 数据装载, 配置初始化等前置工作
    • 测试后: 释放资源等收尾工作

如何衡量代码是否经过了足够的测试? 如何评价项目的测试水准? 如何评估项目是否达到了高水准测试等级?

答: 代码覆盖率