这是我参与「第五届青训营 」笔记创作活动的第4天
1、Go语言锁 Lock
Go语言中提供了内置的锁机制,即 sync.Mutex。我们可以使用这个锁来保护共享资源,防止多个 goroutine 同时访问。
使用方法如下:
Copy code
import "sync"
var lock sync.Mutex
func main() {
lock.Lock()
// 访问共享资源
lock.Unlock()
}
在上面的代码中,我们首先声明了一个锁变量 lock,然后在访问共享资源之前调用了 lock.Lock() 方法,获取锁。在访问完共享资源之后,调用了 lock.Unlock() 方法释放锁。
还有一种简写的方式, 使用 defer 关键字
Copy code
var lock sync.Mutex
func main() {
lock.Lock()
defer lock.Unlock()
// 访问共享资源
}
这样可以避免程序因为某种原因导致未解锁而导致死锁.
2、Go语言线程同步 WaitGroup
Go语言中提供了 sync.WaitGroup 工具来帮助我们管理多个 goroutine 的同步。我们可以使用 WaitGroup 来等待多个 goroutine 完成任务。
使用方法如下:
Copy code
import "sync"
var wg sync.WaitGroup
func worker() {
defer wg.Done()
// do something
}
func main() {
wg.Add(2)
go worker()
go worker()
wg.Wait()
}
在上面的代码中,我们首先声明了一个 WaitGroup 变量 wg,然后调用 wg.Add(2) 将需要等待的 goroutine 数量设为 2,接着启动两个 goroutine 运行 worker 函数。在 worker 函数结束时调用 wg.Done()来通知 WaitGroup 一个 goroutine 已经完成。最后在主函数中调用 wg.Wait() 来等待所有 goroutine 完成。
使用 WaitGroup 能够简化我们管理多个 goroutine 的同步过程。
3、Go Module
Go Module是 Go语言1.11版本新增的包管理工具,它能够解决 Go语言项目依赖管理的问题。
使用 Go Module 需要先在项目目录下执行 go mod init 命令,初始化一个 Go Module,会生成一个 go.mod 文件。
之后就可以使用 go get 命令来管理项目的依赖包了。
例如:
Copy code
go get -u github.com/pkg/errors
这样就可以将 github.com/pkg/errors 这个包作为项目的依赖包来管理了,并且会在 go.mod 文件中记录这个依赖。
Go Module还支持版本控制,可以指定包的特定版本,避免因为包更新导致项目不兼容的问题。
还支持本地包的引用,可以方便地在不同项目之间共享代码。
总的来说, Go Module是一个非常方便和强大的包管理工具,能够帮助我们更好地管理项目依赖,提高开发效率。
在 Go语言中,我们可以使用三种不同的方式来进行测试:单元测试、Mock测试和基准测试。
1、单元测试
单元测试是针对程序中的最小单元进行测试,如函数、方法等。在 Go语言中,我们可以使用 testing 包来编写单元测试。
使用方法如下:
Copy code
package main
import "testing"
func TestAdd(t *testing.T) {
result := add(1, 2)
if result != 3 {
t.Error("Expected 3, but got ", result)
}
}
在上面的代码中,我们编写了一个名为 TestAdd 的测试函数,并使用 t.Error 方法来输出错误信息,如果测试不通过。
使用 go test 命令来运行单元测试。
2、Mock测试
Mock测试是指在单元测试中,模拟外部依赖的行为,以便于测试被测试单元的函数或方法。
Mock可以使用一些mock库,比如mockgen。
3、基准测试
基准测试是指在 Go语言中使用 testing.B 包来测试程序的性能。使用 testing.B.Run 方法来运行基准测试,并使用 testing.B.N 方法来获取运行次数。
使用方法如下:
Copy code
package main
import "testing"
func BenchmarkAdd(b *testing.B) {
for i := 0; i < b.N; i++ {
add(1, 2)
}
}
在上面的代码中,我们编写了一个名为 BenchmarkAdd的基准测试函数,在循环中调用了add函数,并使用了b.N 来获取运行次数。
使用 go test -bench 命令来运行基准测试。
总的来说, 单元测试是对于程序中的最小单元进行测试,Mock测试是在单元测试中模拟外部依赖的行为,而基准测试则是用来测试程序的性能。这三种方法都是软件开发过程中非常重要的一部分,能够帮助我们提高程序的质量和可靠性。
需要补充的是, 在Go语言中, 单元测试、Mock测试和基准测试的文件名都必须以 _test.go 结尾, 例如:example_test.go。这样才能被go test命令识别。
其中, 单元测试函数的命名规则为TestXXX(t *testing.T), 其中XXX为需要测试的函数名。
Mock测试主要是通过mock库来生成模拟的依赖对象,进行测试。
基准测试函数的命名规则为BenchmarkXXX(b *testing.B), 其中XXX为需要测试的函数名。