DAY2 Go 语言工程实践学习记录| 青训营

84 阅读3分钟

DAY2

GO语言进阶与依赖管理

1.并发编程

并发:多线程程序在一个核的cpu上运行,通过时间片切换实现同时运行的状态

并行:利用多核实现多线程的同时在cpu上运行

GO实现了高性能并发调度模型, 充分发挥多核优势.

线程与协程:线程内核态,是系统的资源,栈MB级别。而协程是用户态,轻量级线程,栈KB级别,一个线程跑多个协程。

协程是GO独有,这是go适合高并发应用场景的原因。

tips:

1.print和println 在golang中 是属于输出到标准错误流中并打印.

2.fmt.Print,fmt.Println属于官方包fmt中自带的打印方法,在golang中 是属于标准输出流,一般使用它来进行屏幕输出

​
**快速打印**,创建协程运行:
​
```go
func HelloGoRoutine() {
    for i := 0; i < 5; i++ {
        go func(j int) {
            hello(j)
        }(i)//末尾括号表示匿名函数被直接调用,有参数传入将参数写在括号里
    }
}

tips:print,Sprint,printf的区别.

GO提倡通过通信channel共享内存(多个协程访问同一个内存空间),而不是通过共享内存而实现通信.

可以通过make(chan 元素类型,[缓冲大小])来创建通道

并发安全Lock:

加锁与否,决定并发是否安全,对临界区的控制。

WaitGroup:实现并发任务的同步。

(内部维护了一个计数器,开启协程+1,执行结束-1,计数为0时主协程阻塞结束)

func ManyGoWait() {
    var wg sync.WaitGroup
    wg.Add(5)//添加5个协程
    for i := 0; i < 5; i++ {
        go func(j int) {
            defer wg.Done()//defer进队列,wg.Done 计数器-1代表协程执行结束
            hello(j)
        }(i)
    }
    wg.Wait()//主协程阻塞,在上面5个字协程执行完前不会往下进行
}

2.依赖管理

依赖像java中一样,是前人研发好的包来进行依赖导入,实现各种功能,调用轮子。

(1)GOPATH是go语言的环境变量:项目直接依赖于src下的代码,通过go get下载,无法实现多版本控制.

(2)Go Vendor

项目增加Vandor文件夹,存放依赖包副本,依赖优先从这里获取,没有再去GOPATH,通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题,无法控制依赖的版本

(3)Go Module

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

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

依赖管理的三要素:配置文件go.mod/中心仓库管理依赖库Proxy/本地工具go get/mod,类比Maven

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

go mod download 下载模块到本地缓存

go mod tidy 增加需要的依赖,删除不需要的依赖//每次运行之前执行一次

测试

测试是开发中的重中之重,尤其是企业开发,关系到安全。

(1)回归测试-->回归应用场景

(2)集成测试->对于功能进行测试

(3)单元测试->开发者对于单个模块进行测试

成本降低,覆盖率减小

单元测试

规则:

1.测试文件以_test.go结尾

2.func TestXxx(*testing.T)测试函数编写

3.初始化逻辑放在TestMain中

代码覆盖率:

即为测试的覆盖度,可以简单的理解为运行过程中跑过的代码占全部代码的百分百

测试分支独立,单元粒度足够小,函数单一职责

幂等:重复运行一个测试,结果一样

稳定:单元测试能够相互隔离,独立运行

Mock测试

mock测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法

函数/方法打桩:用函数a替换函数b,取消对于测试文件的依赖,保证单元测试稳定性

基准测试

基准测试(benchmarking)是一种测量和评估软件性能指标的活动。

func BenchmarkXxxx(b *testing.B)

可用字节开源的fastrand提高性能,优化基准测试

项目实践

1.需求描述:社区话题单页面,展示话题,回帖列表

2.需求用例分析:ER图,结构体设计,类似于数据库设计?

3.分层模型:常规开发分层

数据层,逻辑层,视图层

外部数据增删改查Model

处理核心业务逻辑输出Entity

视图View处理和外部的交互逻辑

4.组件工具

Gin:高性能的go web框架

Go Mod

!map索引方式存储数据行,性能高,速度快

无交叉操作可以并行处理提高效率。

今日课程总结

第二天的学习主要是go语言中并发编程,依赖相关和测试的内容。

并发编程中引入了go中特有的协程概念,一个线程可分为多个协程,协程直接还可以通过通道channel进行内存的共享,其中需要注意数据同步的问题,可以用lock,但最好还是用sync.WaitGroup()来进行实现,它的本质是维护了一个管理协程的计数器。

依赖管理中介绍了三种依赖管理的方法,其中Go Module是现在主流的使用工具,通过相关命令来对依赖进行管理。

测试中讲述了3中测试方法,很好地复习了我对于测试概念的了解,单元测试,Mock测试,基准测试各自有不同的应用场景.

而项目实践中对业务进行了简单的开发流程介绍,需要用到gin框架来进行web的后端开发,类似于Java中的Spring框架。

思考:

总之对于GO语言的基础语法,还需要加深学习,其中匿名函数的语法规则,标准库不同的近似方法也模糊不清,需要加强。