Go语言工程实践 | 青训营

35 阅读2分钟

01

并发编程

多线程程序在一个核的CPU上运行

Goroutine

协程:用户态,轻量级线程,栈KB级别

线程:内核态,线程跑多个协程,栈MB级别

在函数前加关键字go创建协程

CSP

通过通信共享内存

Channel

make(chan 元素类型, [缓冲大小])

有缓冲通道

make(chan int,2)

无缓冲通道/同步通道

make(chan int)

并发安全LOCK

WaitGroup

实现并发任务的同步

内部维护一个计数器

开启协程+1

执行结束-1

主协程阻塞直到计数器为0

02

依赖管理

Go依赖管理演进

GOPATH->Go vendor->Go Module

GOPATH

bin

项目编译的二进制文件

pkg

编译的中间产物

src

项目源码

项目代码直接以来src下的代码

通过go get下载最新版本的包到src目录下

GOPATH无法实现package的多版本控制

Go Vender

项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor

依赖寻址方式:vendor=>GOPATH

项目依赖优先从vendor目录下获取

可能出现依赖冲突,编译出错

Go Module

通过go.mod文件管理依赖包版本

通过go get/go mod指令工具管理依赖包

依赖管理

配置文件,描述依赖:go.mod

中心仓库管理依赖库:Proxy

本地工具:go get/mod

依赖配置

依赖标识:[Module Path] [Version/Pseudo-version]

语义化版本

MAJOR.{MAJOR}.{MINOR}.${PATCH}

不同MAJOR版本可以是不兼容的

MINOR通常是做一些功能和函数更新

PATCH通常是做一些bug修复

commit伪版本

v.x.0.0-yyyymmmmddffss-gcfdtd145275

版本前缀-时间戳-十二位哈希值前缀

关键字

indirect:为直接导入的依赖模块

incompatible:标识可能存在一些不兼容的代码逻辑

go选择版本最低的兼容版本

依赖分发

Proxy

缓存源站中的软件内容

GOPROXY="proxy1.cn,http://proxy2.cn ,direct"

go get

go mod

03

测试

回归测试

集成测试

单元测试

单元测试—规则

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

单元测试—运行

go test[flags] [packages]

单元测试—覆盖率

单元测试一般覆盖率为50%~60%,较高覆盖率80%+

测试分支相互独立、全面覆盖

测试单元粒度足够小,函数单一负责

单元测试—依赖

单元测试—Mock

monkey:github.com/bouk/monkey

组件工具

组件以及技术点

web框架:Gin

在vscode中生成go.mod文件后,在终端输入

go get -u github.com/gin-gonic/gin

将gin引入到代码中

import "github.com/gin-gonic/gin"