语言进阶及依赖管理|青训营笔记

70 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的的第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:项目源码)