Go 语言入门(二) -- 工程实践进阶 协程Goroutine 通道Channel 互斥锁 mutex 计数器waitGroup GoPath包管理

Go 语言入门 – 工程实践进阶

1. Goroutine

1.1 Why Goroutine

线程属于内核态,栈内核态;

协程是轻量级线程, 栈kB级 属于用户态

如下代码: 直接使用关键词 go 可以直接创建一个协程

func hello(i int) {
	defer fmt.Println("hello, ", i)
}

func main() {
	for i := 0; i < 5; i++ {
		//go hello(i)
		go func(j int) {
			hello(j)
		}(i)
	}
	time.Sleep(time.Second)
}

1.2 CSP – goroutine communication

建议使用通信共享内存而不是通过共享内存实现通信,共享内存属于临界区,访问时需要加锁,会影响协程并发效率
在这里插入图片描述

1.3 Channel

如下图, 无缓冲通道和有缓冲通道,原理类似于操作系统的单缓冲区和双缓冲区

语法: make(chan 元素类型, [缓冲大小])
在这里插入图片描述

示例代码:

func CalSquare() {
	src := make(chan int)
	dest := make(chan int, 3)
	go func() {
    //defer 关键词的作用是 在同一作用域内代码执行完后执行该语句
		defer close(src)
		for i := 0; i < 10; i++ {
			src <- i
		}
	}()
	go func() {
		defer close(dest)
		for i := range src {
			dest <- i * i
		}
	}()
	for i := range dest {
		println(i)
	}
}

1.4 Lock 临界区

协程共享资源,互斥访问时,需要加锁

如图所示,如果对于共享资源 x 不加锁访问,下面例子会发生写后写的错误,导致最后结果与我们预期不相符。
在这里插入图片描述

1.5 waitGroup

sync.WaitGroup 计数器包括如下三个操作函数

在这里插入图片描述

如下示例中 time.Sleep() 函数可以由waitGroup 代替
在这里插入图片描述
在这里插入图片描述

2. 如何管理依赖库: GOPATH --> GO Vendor --> Go Model

2.1 GOPATH:

​ 环境变量 GOPATH 是 go 项目的依赖库路径, 可通过 go env 查看或修改 $GOPATH 变量。

​ $GOPATH 下的三个目录作用如下所示:
在这里插入图片描述

弊端:

在这里插入图片描述

2.2 GO Vendor:

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

  • 依赖寻址方式: vendor => GOPATH

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

在这里插入图片描述

弊端:

  • 无法控制依赖的版本
  • 更新项目又可能出现依赖冲突,导致编译错误

在这里插入图片描述

2.3 Go Module

目标 – 定义版本规则和管理项目依赖关系

  • 通过 go.mod 文件管理依赖包版本
  • 通过 go get/ go mod 指令工具管理依赖包
2.3.1 依赖管理三要素
  1. 配置文件,描述依赖 go.mod

  2. 中心仓库管理依赖库 Proxy – 远程代理库

  3. 本地工具 go get/mod 指令

在这里插入图片描述

  • 主版本2+模块会在模块路径增加 /vN 后缀

  • 对于没有 go.mod 文件并且主版本2+的依赖,会 + incompatible

2.3.2 版本格式

在这里插入图片描述
在这里插入图片描述

2.3.3 依赖分发

在这里插入图片描述
在这里插入图片描述

2.3.4 工具

在这里插入图片描述

在这里插入图片描述

3.测试

  • 回归测试:抖音刷视频,点赞等测试

  • 集成测试: 自动化功能接口测试

  • 单元测试: 具体到每个函数模块

在这里插入图片描述

3.1 单元测试

在这里插入图片描述

assert & go test :

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

编码原则:

​ 编写函数应该尽量小,单一职责原则

在这里插入图片描述

3.2 外部依赖测试

在这里插入图片描述

3.2.1: 打桩 Mock

​ 打桩后,使得函数不再被外部依赖影响

三方依赖: github.com/bouk/monkey
在这里插入图片描述

在这里插入图片描述

3.3 基准测试

​ go test -bench=.

​ 测试性能,热点代码

图片均来自字节青训营课程,博客作为自己学习记录,如有侵权,麻烦联系删除。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值