这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
前言
本节课程主要分为四个方面:
- 并发编程
- 依赖管理
- 单元测试 Mock测试 基准测试
- 项目实战 - 组件及技术点
1. 并发编程
1.1通过通信共享内存而不是通过共享内存而实现通信
1.2开启了 3 个 go 协程,用于打印输出数字123
package attention
import (
"time"
)
func closure() {
for i := 0; i < 3; i++ {
go func() {
println(i)
}()
}
time.Sleep(3 * time.Second)
}
func closure1() {
for i := 0; i < 3; i++ {
go func(j int) {
println(j)
}(i)
}
time.Sleep(3 * time.Second)
}
1.3 channel
make(chan int) 无缓冲通道
make(chan int,2)有缓冲通道
A 子协程发送 0-9
B 子协程计算输入数字的平方
主协程输出最后平方数
package main
func CalSquare() {
src := make(chan int)
dest := make(chan int, 3)
go func() {
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)
}
}
func main(){
CalSquare()
}
1.4并发安全 Lock,原子操作,进入临界区加锁退出解锁
var(
x int64
lock sync.Mutex
)
func addWithLock (){
for i := 0; i < 1000; i++ {
lock.Lock()
x += 1
lock.Unlock()
}
}
func addWithoutLOck(){
for i := 0; i < 2000; i++ {
x += 1
}
}
1.5WaitGroup
计数器 开启+1,执行 -1
func hello(i int) {
println("hello world : " + fmt.Sprint(i))
}
func ManyGo() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go func(j int) {
defer wg.Done()
hello(j)
}(i)
}
wg.Wait()
}
2.依赖管理
2.1演进
1.GPATH
一个环境
src bin pkg
项目依赖src
2.GOVender
每个项目都有自己的vendor目录,存放第三方库
GOVENDOR有大量第三方依赖管理工具:glide,dep,go dep
3.Go Mudule
通过 go.mod文件管理依赖包 go mod由go命令统一的管理,用户不必关心目录结构
依赖管理三要素
1.配置文件 go.mod
2.中心仓库管理依赖库 Proxy
3.本地工具 go get/mod
依赖配置
依赖图
依赖分发-回源
3. 单元测试
3.1什么是单元测试 单元测试是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。 3.2怎么进行单元测试
- 要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。
- 单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀
- func TestXXX( t *testing.T )
- 测试用例文件不会参与正常源码编译,不会被包含到可执行文件中。
- 测试用例文件使用 go test 指令来执行,不需要 main() 作为函数入口。
- 测试用例可以不传入 *testing.T 参数
- 新建的测试文件一般和源文件 放同一目录
Mock测试 基准测试