浅看GO | 青训营

74 阅读2分钟

Go语言特点(对js和java)

  1. 高性能、高并发
  2. 语法简单、学习曲线平缓
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译
  7. 跨平台
  8. 垃圾回收

安装网站

  • go.dev/
  • studygolang.com/dl
  • goproxy.cn/

优点

并发VS并行

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

Goroutine

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

CSP (Communicating Sequential Processes)

提倡通过通信共享内存而不是通过共享内存而实现通信

Channel

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

  • 无缓冲通道 make(chan int)
  • 有缓冲通道 make(chan int2)

并发安全Lock

WaitGroup

Go依赖管理演进

  • GOPATH
  • Go Vender
  • Go Module
  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本
  • GOPATH的弊端:无法实现package的多版本控制
  • Go Vendor:项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
  • 依赖寻址方式:vendor => GOPATH(通过每个项目引入一份依赖的副本,结局了多个项目需要一个package依赖的冲突问题。)
  • Vendor的弊端:无法控制依赖的版本,更新项目可能出现依赖冲突,导致编译出错。对照前端的问题
  • Go Module:通过go.mod文件管理依赖包版本,通过go get/go mod指令工具管理依赖包
  • 终极目标:定义版本规则和管理项目依赖关系

依赖管理三要素

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

依赖配置

依赖标识:[Module Path] [Version/Pseudo-version] 常见是的是incompatible,主版本2+模块会在模块路径增加/vN后缀,这能让go module按照不同的模块来处理同一个项目不同主版本的依赖。由于gomodule是1。11实验性引入所以这项规则提出之前已经有一些仓库打上了2或者更高版本的tag了,为了兼容这部分仓库,对于没有go.mod文件并且主版本在2或者以上的依赖,会在版本号后加上+incompatible 后缀 前面讲语义化版本提到,对于同一个库的不同的major版本,需要简历不同的pkg目录,用不同的gomod文件管理,如下面仓库为例,V1版本gomod在主目录下,而对于V2版本,则单独简历了V2目录,用另一个gomod文件管理依赖路径,来表明不同major的不兼容性。,那对于有些V2+tag版本的依赖包并未遵循这一定义规则.

体会

做微服务应该很好,上手很容易,换换口味