Go语言入门-工程实践 | 青训营笔记

210 阅读2分钟

标题:Go语言入门-工程实践 | 青训营笔记

这是我参与「第三届青训营-后端场」笔记创作活动的第二篇

语言进阶--并发编程

并发VS并行

  1. 并发--多线程程序在一个核的cpu上运行

  2. 并行--多线程程序在多个核的cpu上运行

  3. Go可以充分发挥多核优势,高效运行

Goroutine

  1. 协程--用户态,轻量级线程,栈MB级别

  2. 线程--内核态,线程可以并发地跑多个协程,栈KB级别

  3. 开启协程--在调用函数的时候在函数前加关键字go

    //快速打印
    func hello(i int){
        println("hello")
    }
    func HelloGoRoutine(){
        for i:=0 ;i<5 {
            go func(j int){
                hello(j)
            }(i)
        }
        time.Sleep(time.Second)//做阻塞让协程不退出
    }
    

CSP

协程间的通信--提倡通过通信共享内存而不是通过共享内存而实现通信

Channel

  • 是一种引用类型

  • 创建

    • make(chan 元素类型,[缓冲大小])
    • 无缓冲通道 make(chan int) 同步通道
    • 有缓冲通道 make(chan int,2) 可以解决同步问题
  • 通道的容量代表着能存在多少内容-生产消费模型

  • 并发安全--能保证原有顺序

  • 由于消费者的消费速度大于生产者的生产速度,使用带缓冲的通道可以避免剩余过多

并发安全 Lock

  • 加锁 .Lock() 不加锁.Unlock()
  • 避免对共享内存做一些非并发安全的操作

WaitGroup

  1. 三个方法
    1. Add(delta int) 计数器+delte
    2. Done() 计数器-1
    3. Wait() 阻塞直到计数器为0
  2. 计数器
    1. 开启协程+1;执行结束-1;主协程阻塞直到计数器为0 (所有并发任务执行完成)

依赖管理

背景

  • 依赖指的是各种的开发包,已经封装好和经过验证的工具包
  • 工程项目不可能基于零标准库
  • 管理依赖库

Go依赖管理演进

GOPATH -> Go Vendor -> Go Module

目标

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

GOPATH

  • 项目代码直接依赖src下的代码
  • go get 下载最新版本的包到src目录下
  • 存在的弊端
    • 无法实现package的多版本控制

Go Vendor

  • 项目目录下增加vendor文件,所有依赖包副本形式放在vendor下
  • 存在的弊端
    • 无法控制依赖的版本
    • 更新项目又可能出现依赖冲突,导致编译出错

Go Module

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包
  • 实现终极目标:定义版本规则和管理项目依赖关系
  • 依赖管理三要素
    • 配置文件,描述依赖 go.mod
    • 中心仓库管理依赖库 Proxy
    • 本地工具 go get/mod
  • 版本的选择:选择最低的兼容版本

测试

单元测试

包括函数,模块等,通过输入将输出与期望值进行校对

保证质量,提示效率

规则

  • 所有测试文件以 _test.go结尾
  • func TestXxx(*testing.T)
  • 初始化逻辑放到TestMain中

基准测试