Go 语言进阶与依赖管理 | 青训营

46 阅读2分钟

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]) 根据有无缓冲区可分为如下两种类型:

  1. 有缓冲区通道 (可以同步消费者-生产者模型两者的速率)
  2. 无缓冲区通道

示例代码如下:

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来实现来管理依赖。其有如下特点:

  1. 通过go.mod文件管理依赖包版本
  2. 通过go get/go mod指令工具管理依赖包

依赖管理三要素:配置文件(描述依赖)、中心仓库和本地工具。 依赖配置会选择最低的兼容版本

Go mod 使用 GOPROXY环境变量进行控制,

2. 测试

测试包含如下类型:

1.回归测试 2.集成测试 3.单元测试

单元测试规则:

  1. 所有测试文件以_test.go结尾
  2. 测试函数命名规范为:func TestXxx(*testing.T)
  3. 初始化逻辑放到TestMain

使用代码覆盖率来评价单元测试的效果。一般覆盖率为:50% ~ 60% 较高覆盖率:80% 想· 提升代码覆盖率有这些方法:测试分支相互独立,全面覆盖;测试单元粒度足够小,函数单一职责。

2.1 单元测试mock

当某些函数、功能还未完成时,可以使用mock机制来去覆盖该函数和功能来完成测试。 GO 语言还提供了基准测试,其以Benchmark开头。

3.1 创建项目流程

  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

视频中后面的内容就缺少演示而有点难理解了。