Go语言特点(对js和java)
- 高性能、高并发
- 语法简单、学习曲线平缓
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
安装网站
- 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指令工具管理依赖包
- 终极目标:定义版本规则和管理项目依赖关系
依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 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版本的依赖包并未遵循这一定义规则.
体会
做微服务应该很好,上手很容易,换换口味