前言:嗯,通过一定的借鉴和学习,以及被某位不愿透露姓名的大佬教育了一下下,暂且写个前言吐槽一下,今天呢,就把这个进阶部分的依赖管理浅写一个笔记
包括对依赖管理和自动化构建工具的深入了解和应用。依赖管理是指管理项目依赖库的过程。Go语言中使用Go Modules进行依赖管理,可以通过声明项目需要依赖的库及其版本来管理依赖关系。自动化构建工具则是为了简化和加快构建、测试、部署等过程而开发的工具,例如Go语言的常用构建工具有Make、Bazel、Gradle等。在使用这些工具时需要了解和应用相关的概念和技术,例如Makefile的语法、自动化测试、持续集成等。
一.并发编程
Go 语言的并发模型属于是一大特点。
goroutine和channel,可以轻松的编写高效的并发程序
Goroutine是一种轻量级的线程,由Go语言的运行时管理。可以把Goroutine理解为Go语言中的并发执行的基本单位。而channel则是用来在Goroutine之间传递数据的一种通信机制。在Go语言中,使用channel来进行数据的同步和通信,可以有效地避免了多个Goroutine之间的数据竞争和不一致性问题。
func main(){
go doSomething()
}
用channel也很简单,用make创建一个channel变量,用<-进行数据读取和写入
ch := make(chan int)
ch <- 1 //写入数据
data := <- ch //读取数据
channel不仅可以被用来传递数据,还可以被用来进行同步操作。常用的同步操作包括使用channel来进行线程间的同步,以及使用channel来进行任务的协调等。
二.标准库 标准库:Go语言的标准库提供了丰富的功能和工具,包括网络编程、文件操作、加密解密、数据序列化等。
- fmt:实现类似C语言的printf和scanf功能,但比C语言更加简便。
- os:提供操作系统函数的访问,获取环境变量,获取命令行参数等功能。
- io:输入输出接口,封装了I/O相关的基本接口。
- strconv:实现基本数据类型和其字符串表示的转换。
- net:提供了基本的网络功能,包括socket开发等。
- time:提供时间相关的函数,包括时间格式化及获取当前时间等。
- sync:提供了基本的同步原语,如Mutex等。
- encoding/json:提供了json编解码的支持。
- flag:实现命令行flag解析。
- testing:提供了对代码进行单元测试和性能测试的支持。
三.性能优化
- 减少内存分配:一般来说,减少内存分配可以提高程序的性能,可以使用sync.Pool等技术来减少对象的分配。
- 稳定的goroutine数:过多的goroutine会降低程序的性能, 因为它们之间会产生竞争。
- 避免锁争用:在代码中尽可能避免使用锁,因为锁会降低并发性能。可以使用无锁数据结构等技术来规避锁的使用。
- 使用并发编程技术:Go语言天然地支持并发编程,因此可以多使用go关键字创建goroutine以提高程序并发性能。
- 缓存热点数据:对于经常访问的内存块可以使用缓存,它可以有效减少内存分配以及CPU的访问次数, 可以提高程序性能。
四.错误处理 Go语言的错误处理是通过返回错误值来实现的,通常使用error类型表示错误。在函数中,返回值中通常包含一个error类型的错误值,如果不为nil,则表示函数执行过程中发生了错误。可以通过if语句来判断是否发生了错误,并对错误进行处理。除了使用error类型,还可以使用panic和recover来进行错误处理。panic可以用来抛出异常,而recover可以用来捕获异常并进行处理。
五.Go Moudles: emmm,这个东西主要是在终端和命令行里面使用,当然项目代码里也可以写。Go Modules的主要目的之一就是让你在项目代码中明确地管理依赖包和版本。 在使用Go Modules之后,你的项目代码中的导入语句将使用依赖包的模块路径。Go Modules会根据你的go.mod文件中的依赖列表来解析和加载相应的依赖包。
go mod init <> 初始化
go get <> 添加依赖
go get -u <> 升级依赖
go mod tidy 移除依赖
go mod download 下载依赖
go list -m all 查看依赖
除了这些以外,还支持版本控制、指定依赖包的特定版本、使用私有代码库等功能。