GO语言基础语法(2) | 青训营笔记

59 阅读2分钟

01.并发VS并行

GO可以充分发挥多核优势,高效运行。

1.1.Gouroutine

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

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

协程的创建和调度由GO语言本身完成,比线程要轻量很多。

GO语言中开启一个协程只需要在调用函数时在前面加go关键字。

1.2.CSP

提倡通过信息共享内存而不是通过共享内存而实现通信。

1.3.Channel

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

无缓冲通道 make(chan int)

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

无缓冲通道也被称为同步通道

解决同步问题就是设置缓冲区

1.4.并发安全Lock

对临界区的权限控制来保证并发安全

1.5.WaitGroup

Add (delta int) 计数器+delta

Done() 计数器-1

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

02.依赖管理

背景 工程项目不可能基于编制库0~1编码搭建

管理依赖库

2.1GO依赖管理演进

不同环境(项目)依赖的版本不同

控制依赖库的版本

2.1.1GOPATH

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

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

2.1.1GOPATH的弊端

无法实现package的多版本控制

2.1.2GO Vendor

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

2.1.2GO Vendor的弊端

无法控制依赖的版本

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

2.1.3Go Module

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

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

2.2依赖管理三要素

1.配置文件,管理依赖 go.mod

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

03.测试

回归测试 -> 集成测试->单元测试

从上到下,覆盖率逐层变大,成本却逐层降低

单元测试的规则

所有的测试文件要以_test.go结尾

func Test xxx(*testing.T)

初始化逻辑放到TestMain中

在运行代码时,如果根目录有多个文件夹且每个文件里都有go.mod文件。这时就需要在根目录中设置go.work文件来保证两个go.mod文件都可以工作。