Go语言进阶
-
并发与并行: 并发和并行是Go语言的核心特性。并发是指同时处理多个任务(在单一处理器上交替执行)。并行则是指同时运行多个任务(在多个处理器上同时执行)。
-
Goroutine: Goroutine是Go语言中实现并发的主要方法,它比线程更轻量级,更易于管理。每个Goroutine都有自己的调用堆栈,并且可以在其他Goroutine之间进行切换。创建一个新的Goroutine只需要使用关键字
go即可。go funcName(parameters) -
CSP: CSP(Communicating Sequential Processes)是Go语言并发模型的基础,它强调通过通信来共享内存,而不是通过共享内存来通信。这使得Go语言的并发编程更加安全和方便。
-
Channel: Channel是Go语言中实现CSP模型的重要工具,它提供了一种机制,允许两个并发实体进行通信和同步。Channel可以被视为Goroutines之间传递数据的管道。
ch := make(chan int) go func() { ch <- doSomething() }() result := <-ch -
并发安全Lock: 在并发编程中,为了保证数据的一致性和完整性,我们经常需要使用锁。Go语言的sync包提供了两种锁类型:sync.Mutex和sync.RWMutex。前者是互斥锁,后者是读写锁。
-
WaitGroup: WaitGroup用于等待一组Goroutines完成。主Goroutine调用Add添加计数,然后在子Goroutine中调用Done来减少计数。当计数达到0时,Wait函数会返回。
var wg sync.WaitGroup wg.Add(1) go func() { defer wg.Done() // do something }() wg.Wait()
依赖管理
-
Gopath: Gopath是Go语言的工作区,它是环境变量,用于定义Go语言开发环境的工作空间位置。
-
Govendor: Govendor是Go语言的一个依赖管理工具,它能够帮助你管理项目的依赖库。但由于Go 1.11版本引入了Go Modules,因此,govendor已经逐渐被淘汰。
-
Go Modules: Go Modules是Go 1.11及更高版本的官方依赖管理工具。它解决了其他依赖管理工具的一些问题,例如依赖版本管理、跨代理获取依赖等。
测试
-
单元测试: Go语言的testing包提供了单元测试的支持。在Go语言中,以_test.go结尾的文件会被go test命令识别为测试文件。单元测试函数以Test为前缀,并接受一个*testing.T类型的参数。
func TestFunc(t *testing.T) { // testing goes here } -
Mock测试: Mock测试是单元测试的一种,它使用模拟对象替换掉真实对象,以便在测试中模拟真实对象的行为。Go语言的gomock和testify库都可以用来做mock测试。
-
基准测试: 基准测试是用来测试一段程序(可能是一个函数)的性能。在Go语言中,基准测试函数以Benchmark为前缀,并接受一个*testing.B类型的参数。
func BenchmarkFunc(b *testing.B) { for i := 0; i < b.N; i++ { // function to be benchmarked goes here } }