这是我参与「第五届青训营」伴学笔记创作活动的的第2天
本节课内容如下
目录
01.语言进阶
02.依赖管理
1 语言进阶
1-1 并发 vs 并行
并发:多线程程序在一个核的cpu上运行
并行:多线程程序在多个核的cpu上运行
1-2 goroutine
协程:用户态,轻量级线程,栈MB级别
线程:内核态,线程跑多个协程,栈KB级别
协程开启方式:go关键字
1-3 CSP(Communication Sequential Processes)
提倡通过通信共享内存而不是通过共享内存实现通信
1-4 Channel
通道channel:目的:在两个协程之间建立通信
通道分为有缓存的和没有缓存的
创建无缓冲通道:
Unbuffered :=make(chan int)
创建有缓冲通道:
buffered := make(chan int,10)
将值发送到通道代码块需要使用<-运算符:
goroutine1 := make(chan string,5)
goroutine1 <- "hello"
1-5 并发安全 Lock
使用sync.Mutex对数据进行加锁。防止并发过程中多个协程修改同一变量而导致数据错误。
1-6 WaitGroup实现并发同步
计数器
开启协程+1;执行结束-1;主协程阻塞直到计数器为0。
作用:防止子协程还没运行完,主协程就运行结束了。
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func hello(i int) {
defer wg.Done() //goroutine结束就登记-1
fmt.Println("Hello Goroutine!", i)
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1) //启动一个goroutine就登记+1
go hello(i)
}
wg.Wait() //等待所有登记的goroutine都结束
}
2 依赖管理
2-1 背景
工程项目不可能基于标准库0~1编码搭建
管理依赖库
2-2 Go依赖管理演进
GOPATH→GO Vendor→GO Module
不同环境(项目)依赖的版本不同
需要能控制依赖库的版本
2-3 GOPATH
项目代码直接依赖src下的代码
go get下载最新版本的包到src目录下
(bin:项目编译的二进制文件;pkg:项目编译的中间产物,加速编译;src:项目源码)