go依赖管理与工程实践 | 青训营笔记

109 阅读1分钟

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

一、本堂课重点内容:

  • 并发编程
  • 测试
  • 依赖管理

二、详细知识点介绍:

  • 并发

    1. 并发与并行的概念

    2. 协程Goroutine

      协程可以理解成轻量级的线程,与线程相比其开销更少。go协程运行在用户态,编程时使用go关键字开启协程。 开启协程示例代码,协程分别打印:

      func HelloGoRoutine() {
         for i := 0; i < 5; i++ {
            //go关键字:开启协程
            go func(j int) {
               println("hello goroutine : " + fmt.Sprint(j))
            }(i)
         }
         //避免主线程先结束
         time.Sleep(time.Second)
      }
      
      
    3. 通道Channel

      通道是实现协程间通信的一种方式,类似于管道中的水从一端到另一端的流动,数据可以从一端发送到另一端,通过通道接收。go中“不要通过共享内存来通信,而应该通过通信来共享内存”。创建通道使用make关键字,基本格式为 a := make(chan 元素类型, [缓冲大小])

      通道是一个传递数据的数据结构,通过传递指定类型的值来同步运行和通讯。将值传入通道可以使用->,可以通过for range遍历通道中的内容。

      通道演示示例:

      func CalSquare() {
         src := make(chan int)
         dest := make(chan int, 3)
         //A协程
         go func() {
            //结束后关闭src
            defer close(src)
            //0-9加入src
            for i := 0; i < 10; i++ {
               src <- i
            }
         }()
         //B协程
         go func() {
            defer close(dest)
            //获取src中的值,平方后加入dest
            for i := range src {
               dest <- i * i
            }
         }()
      
         //主线程遍历B协程处理结果(遍历dest中的内容)
         for i := range dest {
            println(i)
         }
      }
      
    4. 锁Lock

      可以通过锁实现同步,比如使用互斥锁Sync.Mutex

      sync包下有一个WaitGroup计数器,功能同java juc中的计数器CountDownLatch。WaitGroup有3个方法,Add设置计数初始值、Done在某线程完成工作时将计数器-1、Wait是某个协程在计数器到达0前阻塞。

  • 依赖管理

    1. 发展

      GOPATH -> Go Vender -> Go Module

    2. 依赖分发(Go Module)

      Proxy缓存依赖的各个版本,保证了依赖的稳定性。

    3. 工具(Go Module)

      go getgo mod

  • 测试

    测试的质量某种程度上决定了代码的质量

    1. 单元测试
    2. Mook测试
    3. 基准测试

三、实践练习例子:

一个简单的可以查看上传文章的服务器,要了解需求分析、E-R图,用到了一个go框架——Gin

四、课后个人总结:

对go的并发编程和测试有了一定的理解,但对最后项目的实现流程有疑惑,目前也还没接触gin,感觉节奏有点快。

五、引用参考:

Go 语言进阶与依赖管理课程 juejin.cn/course/byte…

Go 语言工程实践之测试课程 juejin.cn/course/byte…