这是我参与「第五届青训营」伴学笔记创作活动的第 2 天
前言
本文章记录了进阶Go语言部分内容,记录了今天所学的部分知识
1.并发和并行
并发是多线程在一个核的CPU上运行
并行是多线程程序在多个核CPU上运行
对于Go语言来说可以充分利用多核的优势,高效运行
1.1Goroutine
协成:属于用户态,轻量级线程,栈KB级别(在视频中写反了)
线程:内核态,线程跑多个协成,栈MB级别
1.1.1代码练习
通过线程随机打印数字
package main
import (
"fmt"
"time"
)
func main() {
HelloGoRoutine()
}
func hello(i int) {
fmt.Println(i)
}
func HelloGoRoutine() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
1.2CSP(communicating Sequential Processes)
1.2.1通过通信共享内存
Gorountine1->通道->Gorountine2&3
1.2.2通过共享内存实现通信
Gorountine1->临界区->Gorountine2&3
对于GO语言提倡通过通信共享实现通信
1.3Channel
make(chan int) //无缓存通道
make(chan int,2) //有缓存通道
1.3.1Channel代码练习
package main
import (
"fmt"
)
func main() {
CalSquare()
}
func CalSquare() {
src := make(chan int)
dest := make(chan int, 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
}
}()
for i := range dest {
fmt.Println(i)
}
}
2.依赖管理 2.1背景
项目工程不可能基于标准库0-1编码搭建 管理好依赖库可以提升项目构建的效率
2.2Go依赖管理演进
Go的依赖管理演进为这三种
GOPATH->GO Vendor->Go Module
- 在不同环境下依赖的版本不同
- 控制依赖库的版本
2.2.1GOPATH
- 需要在环境变量配置
- 项目代码直接依赖SRC下的代码
- go get下载最新的版本的包到SRC目录下
弊端: 场景:A和B依赖某一package的不同版本 问题:无法实现package的多版本控制
2.2.2Go Vendor
- 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/bendor
- 依赖寻址方式:vendor => GOPATH 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题
弊端:
- 无法控制依赖的版本
- 更新项目又可能出现依赖冲突,导致编译出错
2.2.3Go Module 通过go.mod文件管理依赖包版本 通过go get/go mod 指令工具管理依赖包 最终目的:定义版本规则和管理项目的依赖关系
引用参考
参考的部分内容来源于以下课程或网页:
- 字节内部课:Go 语言进阶 - 工程进阶
- Go语言教程|菜鸟教程