Go 语言进阶与依赖管理| 青训营

57 阅读3分钟

1.1 Goroutine

线程:内核态,线程跑多个协程,栈MB级别,由系统控制,一般没有优先级。

协程:用户态,轻量级线程,栈KB级别,协程由编程者控制,协程之间可以有优先级

线程是CPU最小的调度单位。

为函数添加协程

只需在函数前加go关键字即可

package main

import (
	"fmt"
	"time"
)

func gg(a int) {
	fmt.Println(a, "aa")
}

func main() {
	for i := 1; i <= 3; i++ {
		go func(j int) {
			gg(j)
		}(i)
	}
	time.Sleep(time.Second)
}

1.3 Channel

通过make函数来创建

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

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

总结

当涉及到Go语言中的并发编程时,我们要谈到Goroutine,这是一种轻量级的线程,它在Go语言中用于实现并行任务。使用Goroutine非常方便,只需使用Go关键字就可以启动多个Goroutine,并且它们会由Go语言的调度器进行有效管理。在Goroutine之间,通信是至关重要的,这就引入了通道(Channel)的概念。通道是一种特殊的数据结构,用于在不同的Goroutine之间传递数据。通道分为两种类型:无缓冲通道和缓冲通道。无缓冲通道用于同步数据传输,而缓冲通道则允许在一定程度上异步传输数据。除了通道,Go语言中的并发编程还需要考虑资源共享的问题,这时候锁(Lock)就派上用场了。锁是一种同步机制,用于控制多个Goroutine对共享资源的访问。在Go语言中,我们可以选择不同类型的锁,例如互斥锁(Mutex)和读写锁(RWMutex),以适应不同的并发需求。另外,条件变量(Condition Variable)也是实现并发编程的重要工具之一,它用于在不同的Goroutine之间传递信号和信息,实现协调合作。在进行Go语言开发时,依赖管理也是一个关键的方面。过去,Gopath被用来管理包含源代码和依赖包的目录,但现在官方更推荐使用go mod(模块)进行依赖管理。使用模块可以更好地管理项目的依赖关系,确保代码的可维护性和稳定性。为了确保代码的质量,单元测试在开发过程中扮演着重要角色。通过go test命令,我们可以方便地运行单元测试。单元测试不仅可以测试函数或方法的正确性,还可以确保它们在未来的修改中保持预期行为。单元测试中的一项重要技术是mock测试,它允许我们模拟函数的行为,从而隔离被测试代码的依赖项。此外,基准测试是衡量代码性能的方法,通过与其他实现进行性能比较,我们可以更好地了解代码在不同方案下的表现。Go语言的并发编程、依赖管理以及单元测试是确保代码质量、可维护性和性能的关键环节,它们都为开发者提供了有力的工具来编写高质量的Go代码。