青训营笔记2 - GO工程进阶

64 阅读3分钟

青训营笔记2 - GO工程进阶

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

概述

今天的课程内容主要分为下面四个部分:

  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战 因为作者能力有限,记笔记也只能挑一些对本人来说较为重要或易忘的来记。

并发编程

  • goroutine
    goroutine是Go语言中的轻量级线程实现,Go程序会智能地将goroutine中的任务分配给每个CPU。

    • 创建一个goroutine go 函数名(参数列表)
  • channel
    channel是Go语言中一种特殊的类型。在任何时候,同时只能有一个goroutine访问通道,获取或发送数据。

    • 声明一个channel var 通道变量 chan 通道类型
    • 另一种方法make(chan 通道类型[,通道缓冲区大小]) 设定缓冲区大小可以避免生产者速度比消费者快而通道阻塞的情况。
  • sync.Mutex
    Mutex是一种锁,当一个goroutine获得锁后,其他goroutine只能等待释放锁。用法类似于数据类型。

    • 声明锁var lock sync.Mutex
    • 加锁lock.Lock()
    • 解锁lock.Unlock()
  • WaitGroup
    WaitGroup又称等待组,等待组内维护一个计数器

    • 声明等待组 var wg sync.WaitGroup
    • 改变等待组的计数 wg.Add(5) wg.Done() wg.Add(-1)
    • 进入阻塞状态 wg.Wait() 使用 Add(5) 表示我们有 5个 子任务,然后起了 5个 协程去完成任务,主协程使用 Wait() 方法等待 子协程执行完毕,输出一共等待的时间。
func main() {
    var waitGroup sync.WaitGroup

    start := time.Now()
    waitGroup.Add(5)
    for i := 0; i < 5; i++ {
        go func() {
            defer waitGroup.Done()
            time.Sleep(time.Second)
            fmt.Println("done")
        }()
    }

    waitGroup.Wait()
    fmt.Println(time.Now().Sub(start).Seconds())
}

/*
done
done
done
done
done
1.000306089
*/

WaitGroup 一共有三个方法:

(wg *WaitGroup) Add(delta int)
(wg *WaitGroup) Done()
(wg *WaitGroup) Wait()
  • Add 方法用于设置 WaitGroup 的计数值,可以理解为子任务的数量
  • Done 方法用于将 WaitGroup 的计数值减一,可以理解为完成一个子任务
  • Wait 方法用于阻塞调用者,直到 WaitGroup 的计数值为0,即所有子任务都完成

正常来说,我们使用的时候,需要先确定子任务的数量,然后调用 Add() 方法传入相应的数量,在每个子任务的协程中,调用 Done(),需要等待的协程调用 Wait() 方法。

依赖管理

主要介绍和推荐了go model的使用。具体安装见教程。具体使用和创建与其他依赖管理工具类似,不细写。
在对应项目目录下创建go model 文件后填入相关依赖,引入后会产生一个sum文件,对每个依赖产生对应的hash码,以防依赖的仓库主修改依赖后致使使用者出bug。

单元测试

因为学校上课有教过软件测试,感觉上课讲的例子太特殊,基准测试是类似单元测试的性能测试,其余并没学到太多内容。

项目实战

没有手打,只是跟着视频快速浏览了整个过程,感觉效果不是很好,这种项目感觉没有亲手打效果学习效果都不是很好,但由于时间关系为了跟进度没办法。