1月16日Go学习笔记|青训营笔记

79 阅读1分钟

语言进阶与依赖管理

这是我参与【第五届青训营】伴学笔记创作活动的第二天

**学习Go,马上起飞!!!**

image.png

为什么GO的性能如此之好?

  • GO可以充分发挥多核优势,高效运行,GO语言就是为了高并发而诞生的!!!
  • 线程:内核态,线程跑多个携程,栈MB级别;一个线程可以创建上万左右的协程。
  • 协程:用户态,轻量级线程,栈KB级别;

携程

如何创建携程

在函数前加上go标签即可,如例:

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

携程之间如何通信

image.png

左图是通过通道共享内存,Goroutine是构成并发的执行体,通道相当于传输队列,遵循着先入先出的规则,能保证收发信息的顺序。

右图是通过共享内存实现通信,需要使用互斥量对资源进行加锁,不同的Goroutine会相互争夺资源,会影响程序性能。

通道

通道分为有缓冲通道和无缓冲通道,通过关键字make创建。

  • 无缓冲通道 make(chan int),发布和接收的Goroutine同步化
  • 有缓冲通道 make(chan int,2),缓冲区有空余时,才能进行传输信息

依赖管理

我们要站在巨人的肩膀上

image.png

Go的依赖管理演变

image.png 目前广泛运用的是Go Moudle

GPPATH

定义:

  • 环境变量 $GOPATH
  • 项目代码直接依赖src下的代码
  • go get下载最新版本的包到src目录下

弊端:项目A和项目B依赖于某一package的不同版本,无法实现package的多版本控制

Go Vendor

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
  • 依赖寻址方式:vendor=>GOPATH

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

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

Go Module

  • 通过go.mod文件管理依赖包版本
  • 通过go get/go mod指令工具管理依赖包

依赖管理三要素

  1. 配置文件,描述依赖 go.mod
  2. 中心仓库管理依赖 proxy
  3. 本地工具 go get/mod

依赖配置

image.png 若有C1.5版本,仍然会选择C1.4版本,因为只要选择调用的最新的兼容版本