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

64 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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的还是比较 注:初次使用时若有问题,请注意环境变量。

        1. 初始化模块:在项目根目录下执行命令 go mod init <module-name>
        1. 导入依赖:使用命令 go get <dependency> 或在项目代码中导入该依赖。
        1. 更新依赖:使用命令 go get -u <dependency> 更新依赖。
        1. 查看依赖:使用命令 go list -m all 查看所有依赖。
        1. 删除依赖:使用命令 go mod tidy 删除未使用的依赖。

参考文章

Go Module详细使用教程,包管理不在难 - 腾讯云开发者社区-腾讯云 (tencent.com)

(8条消息) Golang 锁的使用_程序员阿俊的博客-CSDN博客_golang lock