GO 语言进阶与依赖管理
1.1 GO 语言进阶
GO语言高并发在于其对多核的支持更加友好,从而支持其高效运行。同时GO语言对协程的支持十分友好,协程相比线程更加轻量级。线程可以跑多个协程. 协程跑hello world的示例程序如下示:
package main
import (
"fmt"
"time"
)
func hello(i int){
fmt.Println("hello goroutine: " + fmt.Sprint(i))
}
func HelloGoRoutine(){
for i := 0; i < 5; i ++ {
go func(j int){
hello(j)
}(i)
}
time.Sleep(time.Second)
}
func main () {
HelloGoRoutine()
}
由于系统调度的原因,输出可能为乱序输出。
Go 语言提倡通过通信共享内存,对应有Channel机制,其格式为make(chan type, [size]) 根据有无缓冲区可分为如下两种类型:
- 有缓冲区通道 (可以同步消费者-生产者模型两者的速率)
- 无缓冲区通道
示例代码如下:
package main
import (
"fmt"
)
func main () {
src := make(chan int)
dst := make(chan int, 3)
go func() {
defer close(src)
for i := 0; i < 10; i ++{
src <- i
}
}()
go func() {
defer close(dst)
for i := range src {
dst <- i * i
}
}()
for i := range dst {
fmt.Println(i)
}
}
Go 语言同时也提供了并发控制, Lock机制, 使用示例如下:
var (
x int64
lock sync.Mutex
)
func addWithLock(){
for i := 0; i < 2000; i ++ {
lock.Lock()
x += 1
lock.Unlock()
}
对于协程的同步阻塞,GO语言提供了WaitGroup机制,示例代码如下:
func ManyGoWait(){
var wq sync.WaitGroup
wq.Add(5)
for i := 0; i < 5; i ++ {
go func(j int){
defer wg.Done()
hello(j)
}(i)
}
wq.Wait()
1.2 依赖管理
Go 语言使用Go Module来实现来管理依赖。其有如下特点:
- 通过
go.mod文件管理依赖包版本 - 通过
go get/go mod指令工具管理依赖包
依赖管理三要素:配置文件(描述依赖)、中心仓库和本地工具。 依赖配置会选择最低的兼容版本。
Go mod 使用 GOPROXY环境变量进行控制,
2. 测试
测试包含如下类型:
1.回归测试 2.集成测试 3.单元测试
单元测试规则:
- 所有测试文件以
_test.go结尾 - 测试函数命名规范为:
func TestXxx(*testing.T) - 初始化逻辑放到
TestMain中
使用代码覆盖率来评价单元测试的效果。一般覆盖率为:50% ~ 60% 较高覆盖率:80%
想·
提升代码覆盖率有这些方法:测试分支相互独立,全面覆盖;测试单元粒度足够小,函数单一职责。
2.1 单元测试mock
当某些函数、功能还未完成时,可以使用mock机制来去覆盖该函数和功能来完成测试。
GO 语言还提供了基准测试,其以Benchmark开头。
3.1 创建项目流程
- gin框架安装和项目初始化
// 设置goporxy国内镜像源,否则会因为网络错误而不能下载依赖库
go env -w GOPROXY=https://goproxy.cn,direct
go mod init app_name
go get gopkg.in/gin-gonic/gin.v1@v1.3.0
视频中后面的内容就缺少演示而有点难理解了。