Golang学习(并行/依赖管理/测试) | 青训营笔记

67 阅读2分钟

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

Goroutine

  • 并发与并行
    • 并发是看似同时;并行才真的是同时。
  • 线程与协程
    • 协程是用户态的轻量级线程,栈 MB 级别。
    • 一个线程可以并发运行多个协程。
  • CSP(communication sequential process)
    • 通过 channel 通信而不是共享内存
    • 共享内存会引入 critical section。会降低性能。
      • Go 也有 sync 包来帮助共享内存方式的并发控制
        • 基础的互斥锁

          import "sync"
          var lock sync.Mutex
          lock.Lock()
          // critical section
          lock.Unlock()
          
        • 任务控制

          阻塞主线程

          import "sync"
          var wg sync.WaitGroup
          wg.Add(delta)
          wg.Done()
          wg.Wait()
          
    • channel
      • 无缓冲 (e.g. make(chan int)
      • 有缓冲 (e.g. make(chan int, N))

依赖管理

版本控制

演进

  • GOPATH
    • 一个环境变量指定的工作区。
    • 目录
      • bin 二进制文件
      • pkg 中间产物
      • src 我的项目和我依赖的项目
    • 缺点
      • 无法实现 package 的多版本控制。因为 src 目录下面只能放一个版本的依赖。
  • Go Vendor
    • 我的项目目录下面放依赖的备份/副本。从而每个项目都有自己所需要的依赖版本。
    • 缺点
      • 菱形依赖问题
  • Go Module
    • 配置文件 .mod
      • 可以看 Russ Cox 的博客。
    • proxy
    • 客户端工具

测试

单元测试

单元,如函数、模块。给定输入,判断输出和预期是否一致。

  • 规则
    • 所有的测试文件以 _test.go 结尾。
    • func TestXxx(* testing.T)
    • 初始化逻辑放到 TestMainfunc TestMain(m * testing.M)
  • 评估
    • 单元测试-覆盖率

      go test XXX --cover

Mock

函数替换;避免依赖资源篡改。

基准测试

分析系统性能 BenchmarkXxx

项目开发流程

【话题-帖子】后端处理

视图层(和外部交互)-逻辑层(业务逻辑)-数据层(增删改查)

数据层

topic
{
    "id"
    "title"
    "content"
    "create_time"
}
post
{
    "id"
    "parent_id"
    "content"
    "create_time"
}
    var {
        topicIndexMap map[int64] * Topic
        postIndexMap map[int64] []*Post
       }

逻辑层

type PageInfo struct {
    Topic * repo.Topic
    PostList []*repo.Post
}

视图层

type PageData {
    Code int64
    Msg string
    Data interface{}
}