Day2 Go语言工程进阶 | 青训营笔记

85 阅读1分钟

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

1 语言进阶

1.0 并发vs并行

image.png

1.1 Goroutine

image.png

1.2 CSP

  • go提倡通过通信共享内存(Channel)而不是通过共享内存实现通信(Lock)(但两种机制都有)

1.3 Channel

  • 分为有缓冲通道(典型的生产消费模型,可以解决生产和消费速度不均衡带来的效率问题)和无缓冲通道

1.4 并发安全Lock

1.5 WaitGroup

  • 计数器:Add()``Done()``Wait()

2 依赖管理

  • SDK是什么:SDK(Software Development Kit)
    • SDK和API的关系:SDK包含了API、开发辅助工具、文档等等

2.1 Go依赖管理

  • GOPATH -> Go Vendor -> Go Module
  • 演化本质:更好地兼容不同的版本

2.2 依赖管理三要素

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

2.3 依赖配置/分发

image.png

  • 工具:
    • go get
    • image.png
    • go mod
    • image.png

3 测试

  • 回归测试/集成测试/单元测试

3.1 单元测试

3.2 Mock测试

  • 有外部依赖的情况使用,保证稳定性

3.3 基准测试

  • 分析系统性能

4 项目实战

  • 需求用例 image.png

  • ER图 image.png

  • 分层结构 image.png

  • 单例模式(Singleton)

    • 减少存储的浪费
    • sync.Once:高并发下只执行一次的场景
      • 对外保证的语义:确保once变量传入函数只被执行一次
      • 实现只创建一个对象:
// 全局变量(我们只希望创建一个)
var s *SomeObject
// 定义一个 once 变量
var once sync.Once
// 只希望创建一个,单例模式
func GetInstance() *SomeObject {
    once.Do(func(){
        // 创建一个对象,赋值指针给全局变量
        s = &SomeObject{}
    })
    return s
}

TODO

实战还没写,明天写完单独再发一篇ovo