Go 语言进阶 - 工程进阶 | 青训营笔记

62 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第2天

一、Go 语言进阶与依赖管理

  1. 并发编程
  2. 依赖管理
  3. 单元测试
  4. 项目实战

1、并发编程

并发多线程-单核

并行多线程-多核

1.1 Goroutin

新概念:协程:轻量级线程,Go的高性能并发

1.2 CSP

image.png Go提倡通过通信来共享内存

Go保留通过共享内存实现通信

1.3 Channel 通道

image.png

make(chen 元素类型, 缓存大小)
make(chen int)//无缓冲
make(chen int, 2)//有缓存

补充:GO中的 defer

  • defer的词义:“延迟”,“推迟” 在go语言中,defer关键字来延迟一个函数或者方法的执行
    
  • defer的用法:defer function()
    
  • 如果多个defer函数:栈规则,先延迟后执行,后延迟先执行
    
  • defer函数传递参数的时候: defer函数调用时,就已经传递了参数数据了,只是暂时不执行函数中的代码而已
    
  •  defer函数注意点:
      当外围函数的语句正常执行完毕时,只有其中所有的延迟函数都执行完毕,外围函数才会真正的结束执行。
      当执行外围函数中的return语句时,只有其中所有的延迟函数都执行完毕后,外围函数才会真正返回
      当外围函数中的代码引发运行恐慌时,只有其中所有的延迟含税都执行完毕后,该运行时恐慌才会真正被扩展至调用函数
    

Go协程通过Channel传递消息 协程格式

go fun() {需要协程执行的代码}

1.4 并发安全 Lock

image.png 保护并发安全

保护x的内存,对其他协程锁定

lock.Lock()//

开放x的内存,对所有协程解锁

lock.Unlock()//

1.5 WaitGroup

type WaitGroup

Add(a)//计数器+1

Done()//计数器-1

Wait()//主协程阻塞,直到计数器0

2、依赖管理

2.1 GO依赖演进

GOPATH --> GO Vendor --> GO Module

1、不同环境依赖库版本

2、管理依赖库版本

2.1.1 GoPath

image.png

缺点:无法实现package的多版本控制

2.1.2 GO Vendor

image.png

缺点:package的依赖package会存在依赖库冲突,无法控制依赖版本

2.1.3 GO Module

依赖管理三要素

  1. go.mod 文件管理依赖

  2. go mod/go get 管理工具

  3. Proxy 中心仓库

go.mod文件 image.png

image.png

MAJOR:版本间代码隔离(不兼容)

MINOR:版本增加功能(兼容)

PATCH:版本修复BUG(兼容)

在go.mod中//indirect 标记间接依赖 incompatible:对于没有go.mod且版本2+的依赖

2.3.5 Proxy 依赖分发

Proxy比源站(第三方,如GitHub)更安全可靠

Proxy相当于依赖库缓存

image.png

2.3.7 go get

image.png

2.3.8 go mod

image.png

二、工程实践之测试