Go 语言工程实践上| 青训营

61 阅读2分钟

语言进阶

Go可以充分发挥多核优势,高效运行

1.1 协程

协程:用户态,轻量级线程,栈KB级别(Go语言本身去调动)

线程::内核态,线程跑多个协程,栈MB级别

Go语言可以一次创建上万协程

快速(开多个协程打印)打印hello goroutine:0~hello goroutine :4 调用函数时加一个go关键字

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)
   }

1.2 CSP

Go语言通过通信来共享内存

1.3 Channel

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

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

1.4 并发安全Lock

不加锁会输出未知的结果

1.5 WaitGroup

实现并发同步

Add(delta int),Done(),Wait()

小结 1.协程:通过高效的调度模型实现高并发操作 2.管道:通过通信实现共享内存 3.Sync相关关键字:实现并发安全操作和协程间的同步

依赖管理

依赖:各种开发包

2.0 背景

单体函数只需要依赖原生SDK

实际开发通过SDK引入

2.1 Go依赖管理演进

Gopath--> Go Vendor --> GoModule

实现不同环境的版本

控制依赖库的版本

2.1.1 Gopath

bin:项目编译的二进制文件

pkg:项目编译的中间产物,加速编译

src:项目源码

项目代码直接依赖src下的代码

go get下载最新版本的包到src目录下

弊端:

场景:A和B依赖于某一package的不同版本

问题:无法实现package的多版本控制

2.1.2 Go Vendor

项目目录下增加vendor文件,所有依赖包副本放在#ProjectRoot/vendor

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题

弊端:无法控制依赖版本。更新项目又可能出现依赖冲突,导致编译出错

2.1.3 GoModule

go.mod文件管理依赖包版本

go get/go mod指令工具管理依赖包

定义版本规则和管理项目依赖关系

2.2 依赖管理三要素

1.配置文件,依赖描述 go.mod

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

2.3.1依赖配置

2.3.2依赖配置 -version

语义化版本

基于commit的伪版本

2.3.3依赖配置 -indirect

2.3.4依赖配置 -incompatible

选择最低的兼容版本

依赖管理三要素: 1.配置文件,描述依赖 go.mod 2.中心仓库管理依赖库 Proxy 3.本地仓库 go get/mod