go后端语言进阶和依赖管理 | 青训营笔记

96 阅读1分钟

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

image.png go提倡通过通信共享内存。

1.3 Channel

make(chan 元素类型,[缓冲大小]) image.png

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.依赖

image.png

2.1 GOPATH

文件夹作用
bin项目编译的二进制文件
pkg项目编译的中间产物
src项目源码
  • 项目代码直接依赖 GOPATH/src 下的代码;
  • go get 下载最新版本的包到 src 目录下

缺点
如果多个项目依赖某一个package的不同版本,src 目录下值允许一个版本存在,无法项目保证编译通过。

2.1 Go Vender

每个项目都创建了vender文件夹, 每个项目的依赖包放在自己的vender缺点
放弃了依赖重用,使得冗余度上升

2.3 Go Modules

  1. GOMODULE模式下所有依赖的包存放在$GOPATH/pkg/mod目录下
  2. 项目中需要有go.mod文件,来应用$GOPATH/pkg/mod

3. go mod使用

环境配置go mod
win+R + cmd 输入 go env

image.png
输入
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct\

在项目中配置go mod
执行
go mod init 项目名
go mod tidy