Go语言进阶-工程进阶 | 青训营笔记

43 阅读2分钟

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

一、目录

本节课主要分为四个部分:

1.并发编程

2.依赖管理

3.单元测试

4.项目实战

二、并发编程

1.协程Goroutine

协程与线程的区别:线程为用户态,轻量级线程,栈MB级别;协程为内核态,线程跑多个协程,栈KB级别。

使用go func开启一个协程。

2.通道Channel

无缓冲通道:make(chan int)

有缓冲通道:make(chan int,2)

3.锁Lock

关于锁的操作

锁的定义:

var{
        x int64
        lock sync.Mutex
}

上锁:lock.Lock()

释放锁:lock.Unlock()

4.线程同步WaitGroup

关于WaitGroup的操作

计数器+delta:Add(delta int)

计数器-1:Done()

阻塞直到计数器为0:Wait()

三、依赖管理

1.Gopath

Gopath是go语言的环境变量,是go项目的工作区。

bin 项目编译的二进制文件

pkg 项目编译的中间产物,加速编译

src 项目源码

项目代码直接依赖src下的代码。

使用 go get 下载最新版本的包到src目录下。

弊端

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

2.Go Vendor

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。

弊端

1.无法控制依赖的版本。

2.更新项目有可能出现依赖冲突,导致编译出错。

3.Go Module

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

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

go.mod

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

version

语义化版本与基于commit伪版本。

indirect

用以标识没有直接导入的间接依赖模块。

incompatible

用以标识可能有兼容问题。(对于没有go.mod文件及主版本在v2及以上的依赖)

go get的使用

go get example.org/pkg

@update:默认。

@none:删除依赖。

@v1.1.2:tag版本,语义版本。

@23dfdd5:特定的commit。

@master:分支的最新commit。

go mod的使用

go mod

init:初始化,创建go.mod文件。

download:下载模块到本地缓存。

tidy:增加需要的依赖,删除不需要的依赖。

四、单元测试

测试分类:回归测试、集成测试、单元测试。

测试成本逐渐降低,覆盖率逐渐上升。

单元测试的覆盖率决定代码质量,一般覆盖率需要在50%-60%之间。

五、项目实战

可以先画E-R图帮助分析,本例中实体为话题和帖子,关系为一对多,相应设计出实体的属性。

然后按照分层结构来设计:数据层->逻辑层->视图层。

用的一些工具:

gin:go web框架。

go mod:实现依赖管理。