Go语言进阶 | 青训营笔记

193 阅读1分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 2 天,老师从工程实践角度讲解了Go语言进阶与依赖管理的课程。

语言进阶

Goroutine

协程:用户态,轻量级线程,栈MB级别。
线程:内核态,线程跑多个协程,栈KB级别。

快速打印hello goroutine:0~hello goroutine:4

func hello(i int){
    println("hello goroutine:" + fmt.Sprint(i))
}

func HelloGoRoutine(){
    for i := 0;i < 5;i++{
        go func(j int){
            hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}

结果是并行打印输出:

image.png

CSP(Communicating Sequential Processes)

image.png 提倡通过通信共享内存而不是通过共享内存而实现通信。

Channel

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

  • 无缓冲通道:make(chan int)
  • 有缓冲通道:make(chan int,2)

A子协程发送0~9数字,B子协程计算输入数字的平方,主协程输出最后的平方数

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{
        //复杂操作
        println(i)
    }
}

依赖管理

背景

  • 工程项目不可能基于标准库0~1编码搭建
  • 管理依赖库

Go依赖管理演进

image.png

  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本

GOPATH

  • 项目代码直接依赖src下的代码
  • go get 下载最新版本的包到src目录下
  • 弊端:无法实现package的多版本控制

GO Vender

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
  • 依赖寻址方式:vendor => GOPATH
  • 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
  • 弊端:无法控制依赖的版本;更新项目有可能出现依赖冲突,导致编译出错。