1.1Goroutine
在Go语言中,Goroutine 是一种轻量级的并发实体,可以在用户态创建和管理,相比于传统的操作系统线程,它们更加高效。Goroutine 拥有自己的栈空间(通常为几 KB),并由 Go 调度器负责调度和管理。一个 Go 程序可以创建成千上万个 Goroutine,这为并发编程提供了强大的工具。
协程: 用户态,轻量级的线程,栈KB级别
线程: 内核态,线程跑多个协程,栈MB级别
go可以一次创建上万左右的协程
go func(i int){
}(x)//创建协程
1.2CSP
Go 语言倡导使用通信来共享内存,这是基于 CSP 模型的思想。CSP 强调通过发送和接收消息来进行协作,而不是通过共享内存来实现并发。这种模型可以帮助避免常见的并发问题,如竞态条件和死锁。
1.3 Channel
通道(Channel)是 Goroutine 之间进行通信的主要机制。通道可以有缓冲和无缓冲两种类型。无缓冲通道会阻塞发送方直到接收方准备好接收数据,因此常被称为同步通道。有缓冲通道允许在一定程度上解耦发送和接收操作,发送方不必等待接收方。
make(chan 元素类型,[缓冲大小])
无缓存通道会导致阻塞,所以称为同步通道
有缓冲通道可以解决
func CalSquare() {
src := make(chan int) //无缓冲
dest := make(chan int, 3) //有缓冲
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i //发送到src的channel
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i //发送到dest的channel
}
}()
for i := range dest {
println(i)
}
}
用带缓冲的channel如果消费者的速度慢,不会影响生产者的速度
defer做了延迟的资源关闭
1.4 并发安全Lock
var lock sync.Mutex定义锁
lock.Lock()加锁
lock.Unlock()释放锁
1.5 WaitGroup
var wg sync.WaitGroup定义计数器
Add(delta int)计数器+delta
Done()计数器-1
Wait()阻塞直到计数器为0
2.1依赖管理
Go Module通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包
go.mod依赖配置
版本控制
indirect
间接依赖会标识为indirect
incompatible
对于没有go.mod文件并且主版本2+的依赖,会+incompatible
2.2依赖分发
Go 在获取依赖包时,会从配置的代理(GOPROXY)处获取。可以通过设置 GOPROXY 环境变量来指定代理服务器,这有助于在不同网络环境下加速依赖的下载。
GOPROXY="proxy1.cn,https://proxy2.cn,…"
会一层一层寻找依赖
2.3依赖工具
go get example.ort/pkg @update 默认最新的
go get example.ort/pkg @none 删除依赖
go get example.ort/pkg @v1.1.2 tag版本,语义版本
go get example.ort/pkg @23dfdd5 特定的commit
go get example.ort/pkg @master 分支最新的commit
go mod init 初始化,创建go.mod文件
go mod download 下载模块到本地缓存
go mood tidy 增加需要的依赖,删除不需要的依赖(常用)