语言进阶与依赖管理,我总结了以下知识点:
-
锁 Lock 是 Go 语言中的并发控制机制。当多个 Goroutine(协程)同时访问共享资源时,可能会出现数据竞争的问题。这时可以使用锁来保证临界区(被锁定的代码块)中的共享资源不会被多个 Goroutine 同时访问,从而保证程序的正确性和可靠性。
-
线程同步 WaitGroup 是 Go 语言中用于控制 Goroutine 并发执行的同步机制。当一个 Goroutine 需要等待其他 Goroutine 执行完毕后才能继续执行时,可以使用 WaitGroup。WaitGroup 可以将一组 Goroutine 划分为一个整体,等待整体内的所有 Goroutine 执行完毕后再执行 WaitGroup 之后的代码,从而完成 Goroutine 的同步和协作。
-
Go Module 是 Go 语言中用于包依赖管理的工具。它可以帮助开发者在开发过程中管理好包依赖关系,提高代码复用性和可维护性。Go Module 支持使用模块概念来组织代码,Go 1.11 版本以后的 Go 工具链自带 Go Module 的支持,可以通过命令行工具和 go.mod 文件来管理包依赖关系。
GO语言工程实践之测试,我总结了以下知识点:
-
Mock测试是一种测试技术,它通过自动生成一些模拟对象或方法,来模拟被测试对象的依赖关系,从而解决被测对象的依赖问题。通过使用Mock测试,开发人员可以独立地测试应用程序的组件,而不必依赖于其他软件的实现或服务端点。Mock 测试通常用于集成测试和单元测试。
-
基准测试是一种用于测量一段程序的性能指标的测试类型。基准测试可以帮助开发者了解一个程序在特定情况下的性能表现,例如,当输入的数据集合变得非常大时程序的响应时间、内存占用等。基准测试可以帮助开发者在开发过程中识别性能瓶颈并进行优化,使得程序的性能更好。基准测试通常使用Go语言内置的testing和benchmarking框架来实现。
下面是一个使用GoMock库实现Mock测试的示例代码:
package main
import (
"github.com/golang/mock/gomock"
"testing"
)
// 要测试的函数
func GetUser(id int) (*User, error) {
db := ConnectDB()
user, err := db.GetUserByID(id)
if err != nil {
return nil, err
}
return user, nil
}
// Mock测试
func TestGetUser(t *testing.T) {
ctrl := gomock.NewController(t)
defer ctrl.Finish()
mockDB := NewMockDB(ctrl)
mockDB.EXPECT().GetUserByID(1).Return(&User{1, "Tom"}, nil)
db = mockDB
user, err := GetUser(1)
if user.ID != 1 || user.Name != "Tom" || err != nil {
t.Errorf("Expected User{id: 1, name: Tom}, got User{id: %d, name: %s}", user.ID, user.Name)
}
}
以上例子中,使用 GoMock 库的 NewController 函数来创建一个新的 Mock Controller,接着定义 DB 接口及其 Mock 实现,并在测试用例中使用 mockDB 来替换 ConnectDB 返回的真实数据库对象。此后,我们通过调用 mockDB 的 EXPECT 方法来期望某个接口方法被调用,并调用 GetUser 函数来获得 Mock 对象。
下面是一个使用Go语言内置的testing和benchmarking框架实现基准测试的示例代码:
package main
import (
"testing"
)
func BenchmarkFib10(b *testing.B) {
for i := 0; i < b.N; i++ {
fib(10)
}
}
func BenchmarkFib20(b *testing.B) {
for i := 0; i < b.N; i++ {
fib(20)
}
}
// 计算斐波那契数列
func fib(n int) int {
if n < 2 {
return n
}
return fib(n-1) + fib(n-2)
}
以上示例编写了一个 fib 函数用于计算斐波那契数列,接着使用 Go 语言内置的测试框架实现基准测试,我们定义了两个测试函数:BenchmarkFib10 和 BenchmarkFib20,它们分别计算斐波那契数列的前十项和前二十项。在每个基准测试函数中,我们使用 for 循环来多次执行被测程序,以确保测试结果的可靠性。最后,我们可以使用 go test -bench 命令来运行基准测试。