这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1.并发
1.1 goroutine
协程:用户态, 轻量级线程, 栈KB级别;
线程:内核态, 线程跑多个协程, 栈MB级别。
func HelloGoRoutine(){
for i:=0; i < 5; i++{
go func(j int){
printLn(fmt.Sprint(i))
}
}
time.Sleep(time.Second)
}
1.2 CSP(Communicating Sequential Processes)
go提倡通过通信共享内存。
1.3 Channel
make(chan 元素类型,[缓冲大小])
func CalSquare(){
src := make(chan int)
dst := make(chan int, 3)
go func(){
defer close(src)
for i := 0; i < 10; i++{
src <- i
}
}()
go func(){
defer close(dst)
for i := 0; i < 10; i++{
dst <- i * i
}
}()
for i := range dst{
//复杂操作
PrintLn(i)
}
}
1.4 并发安全Lock
var lock sync.Mutex
for {
lock.Lock()
//临界区
lock.Unlock()
}
1.5 WaitGroup
保证了主线程等待所有子协程执行完后才结束
Add(delta int) 计数器+delta
Done() 计数器-1
Wait() 阻塞直到计数器为0
func ManyGoWait(){
var wg sync.WaitGroup
wg.Add(5)
for i := 0; i < 10; i++{
go func(){
defer wg.Done()
Printfln(i)
}(i)
}
wg.Wait()
}
2.依赖
2.1 GOPATH
| 文件夹 | 作用 |
|---|---|
| bin | 项目编译的二进制文件 |
| pkg | 项目编译的中间产物 |
| src | 项目源码 |
- 项目代码直接依赖
GOPATH/src下的代码; go get下载最新版本的包到src目录下
缺点
如果多个项目依赖某一个package的不同版本,src 目录下值允许一个版本存在,无法项目保证编译通过。
2.1 Go Vender
每个项目都创建了vender文件夹, 每个项目的依赖包放在自己的vender下
缺点
放弃了依赖重用,使得冗余度上升
2.3 Go Modules
- GOMODULE模式下所有依赖的包存放在$GOPATH/pkg/mod目录下
- 项目中需要有go.mod文件,来应用$GOPATH/pkg/mod
3. go mod使用
环境配置go mod
win+R + cmd
输入 go env
输入
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct\
在项目中配置go mod
执行
go mod init 项目名
go mod tidy