这是我参与「第五届青训营 」伴学笔记创作活动的第2天
前言
今天主要是关于锁,线程同步以及module,还有就是几个测试相关的内容。
锁LOCK
一般是有互斥锁和读写锁,用于在多线程环境中保护共享资源,防止数据竞争和不一致性的作用。同时可以确保同一时刻只有一个线程访问共享资源。
Go语言中内置了sync.Mutex结构体实现互斥锁。
声明一个互斥锁很简单
var mutex sync.Mutex
或者使用如下的一个copy的小示例来看
func main() {
var mutex sync.Mutex
count := 0
for r := 0; r < 50; r++ {
go func() {
mutex.Lock()
count += 1
mutex.Unlock()
}()
}
time.Sleep(time.Second)
fmt.Println("the count is : ", count)
}
而读写锁则是对读写操作进行加锁。但是需要有一个互斥关系,可以提高访问效率。包括如下的几个操作
- func (rw *RWMutex) Lock()
- func (rw *RWMutex) RLock()
- func (rw *RWMutex) RLocker() Locker
- func (rw *RWMutex) RUnlock()
- func (rw *RWMutex) Unlock()
顾名思义,lock就是写锁定,unlock就是写解锁,而写锁定后不能再有其他的读写操作。rlock则是读锁定,对应的runlock则是都解锁。
因为如上的问题,那么如果不按规则来是有可能造成协程的阻塞,不过不用担心,当读解锁操作完成只会会试图唤醒main中的阻塞的协程,这时写锁定才会完成。
Go Module
Go module 是 Go 语言用于管理依赖关系的工具。它可以管理依赖关系、下载依赖包,并确保以后在不同环境中重新构建代码得到的结果是一致的。它是 Go 1.11 及更高版本的标准包管理工具。 其中生成的Go。mod文件就相当于是一个配置文件,把依赖内容和版本等都在其中了。类似于maven的还是比较 注:初次使用时若有问题,请注意环境变量。
-
-
-
- 初始化模块:在项目根目录下执行命令
go mod init <module-name>。
- 初始化模块:在项目根目录下执行命令
-
-
-
-
-
- 导入依赖:使用命令
go get <dependency>或在项目代码中导入该依赖。
- 导入依赖:使用命令
-
-
-
-
-
- 更新依赖:使用命令
go get -u <dependency>更新依赖。
- 更新依赖:使用命令
-
-
-
-
-
- 查看依赖:使用命令
go list -m all查看所有依赖。
- 查看依赖:使用命令
-
-
-
-
-
- 删除依赖:使用命令
go mod tidy删除未使用的依赖。
- 删除依赖:使用命令
-
-