这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
并发、并行
- 多线程程序在一个核的 CPU 上运行
- 多线程程序在多个核的 CPU 上运行
Goroutine
- 协程:用户态、轻量级线程,栈 MB 级别
- 线程:内核态,线程跑多个协程,栈 KB 级别
CSP
- 提倡通过通信共享内存而不是通过共享内存而实现通信
Channel
-
make(chan元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道make(chan int,2)
Go依赖管理演进
- 不同环境项目依赖的版本不同
- 控制依赖库的版本
GOPATH
- 项目代码直接依赖 src 下的代码
- 无法实现 package 的多版本控制
Go Vendor
- 通过每个项目引入一份依赖的副本,解决了多个项目需要同一个 package 依赖冲突的问题
- 无法控制项目依赖的版本
- 更新项目有可能出现依赖冲突,导致编译出错
Go Module
- 通过 go.mod 文件管理依赖包版本
- 通过 go get/go mod 指令工具管理依赖包
依赖管理三要素
- 配置文件,描述依赖 go.mod
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
测试
单元测试
- 一般覆盖率:50-60%, 较高覆盖率80%+
- 测试分支相互独立、全面覆盖
- 测试单元粒度足够小,函数单一职责
Mock测试
基准测试
依赖
- 外部依赖 => 稳定&幂等
分层结构
- 数据层:数据Model,外膜数据的CRUD
- 逻辑层:业务Entity,处理核心业务逻辑输出
- 视图层:视图View,处理和外部的交互逻辑
组件工具
-
Go Mod
- go mod init
- go get popkg.in/gin-gonic/gin.v1@v1.3.0
个人想法
看到上面go的一些工程进阶知识,其实和Java的思想都是差不多的,都有MVC的开发思想,go也有像Maven一样有一个管理仓库,也有框架的快速搭建方便开发,减少环境配置的工作量。