一、语言进阶
1.并行和并发:
并发:多线程程序在单核cpu上运行
并行:多线程程序在多核cpu上运行
2. 协程(Goroutine)
Go语言的并发编程,主要就是通过协程(Goroutine)来实现的。
import (
"fmt"
"time"
)
func hello(i int) {
println("hello goroutine :" + fmt.Sprint(i))
}
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
3. CSP(Communicating Sequential Processes)
协程间通信与进程通信类似,主要有2种方式:
- 通道
- 临界区
对于GO语言来说,它采用的是第一种通道的方式,进行协程间的信息传递。这样的好处是通过通信共享内存性能较高,不会像临界区一样,存在性能较低的问题。
4.Channel
make(chan 元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int,2)
可以采用上面make的方式进行初始化,第一个参数指定类型,第二个参数指定缓冲通道的大小。
// 这个程序就是创建了两个channel,一个是src,一个是dest,src写入0-9的数字,dest读取src中的数字并将它的平方写入dest中,最后遍历dest并输出。
import "fmt"
func main() {
CalSquare()
}
func CalSquare() {
src := make(chan int) //src无缓冲队列
dest := make(chan int, 3) //dest有缓冲队列(3)
go func() {
defer close(src)
for i := 0; i < 10; i++ {
src <- i
}
}()
go func() {
defer close(dest)
for i := range src {
dest <- i * i
}
}() //该处缓冲为3是为了不让下方的消费者的消费速度影响生产速度
for i := range dest {
//复杂操作
fmt.Println(i)
}
}
5. 并发控制 Lock
锁的作用主要是用来保证在操作变量时,只有一个协程在操作,这时候另一个协程想要操作的时候,需要等待锁解除才行。这样的操作,可以保证程序执行的正确性,防止程序出错。
6.WaitGroup
相当于一个计数器,记录当前正在执行的协程数,当正在执行的线程数不为 0 的时候,就需要进行一个等待。
二、依赖管理
1.Go语言的依赖管理
可以通过Go模块进行。Go模块是Go语言官方推荐的依赖管理工具,可以自动下载和更新依赖项,并提供了版本控制和依赖锁定功能。
要开始使用Go模块,需要执行以下步骤:
- 在项目根目录下执行
go mod init命令初始化一个新的Go模块。该命令会创建一个名为go.mod的模块文件,其中包含了模块的名称和版本信息。 - 如果需要构建自定义版本的依赖项,可以使用
go build命令并在命令行中指定构建标志。
2.演变过程
GOPATH ->升级为 Go Vendor ->升级为 Go Module
3.依赖管理三要素:
- 配置文件,描述依赖。
- 中心仓库管理依赖库。
- 本地工具。
4.go get/mod为本地工具
go get example.org/pkg
@update(默认)
@none(删除依赖)
@v1.1.2(tag语义版本)
@23dfdd5(特定的commit)
@master(分支的最新commit)
go mod
init(初始化,创建go.mod文件)
download(下载模块到本地缓存)
tidy(增加需要的依赖,删除不需要的依赖)
5.扩展:
- 依赖管理工具:Go模块是Go语言官方推荐的依赖管理工具,它允许开发者管理自己的代码依赖,包括导入第三方库。Go模块可以自动下载和更新依赖项,并提供了版本控制和依赖锁定功能。其他流行的依赖管理工具包括dep、glide和gb。
- 依赖项的导入:在Go语言中,通过使用import关键字来导入依赖项。导入了依赖项后,就可以在代码中使用其中的函数、变量和类型。
- 包管理器的使用:使用包管理器可以方便地安装和管理依赖项。在命令行中执行
go get命令可以下载并安装指定版本的依赖项。例如,要安装一个名为"example.com/package"的包,可以执行go get example.com/package。 - 版本控制:Go模块支持版本控制,开发者可以为项目指定特定的依赖项版本。在代码中使用
import "example.com/package@v1.2.3"可以导入指定版本的依赖项。Go模块会自动解析和下载对应的依赖项。 - 依赖锁定:为了避免在开发过程中由于依赖项的更新导致的不兼容问题,Go模块提供了依赖锁定功能。通过执行
go mod tidy命令,Go模块会生成一个module-lock.json文件,其中包含了所有已安装依赖项的精确版本信息。这样,在后续构建过程中,Go模块会使用这些精确版本信息,确保构建结果的稳定性。 - 自定义模块路径:如果第三方库不在Go模块的官方注册表中,可以将其代码克隆到本地并使用自定义模块路径。在代码中使用
import "path/to/package"导入本地路径。然后,在项目根目录下的go.mod文件中添加相应的module声明,指定自定义模块路径。