go 工程 | 青训营笔记

78 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2笔记

day2

Go实现了并发性能极高的调度模型,可以充分发挥多核计算机的优势

协程Goroutine

go func() {
  //do something
}()

Go鼓励通过通信共享内存,也可以通过共享内存实现通信

通信 Channel

func calSquare() {
	src := make(chan int)
	dest := make(chan int, 3)
	go func() {
		defer close(src)
		for i := 0; i < 10; i++ {
			src <- i
		}
	}()
	go func() {
		defer close(dest)
		for i := range src {
			dest <- i * i
		}
	}()
	for i := range dest {
		println(i)
	}
}

并发安全 Lock

go func() {
	for i := 0; i < 1000; i++ {
  	lock.Lock()
  	x+=1
  	lock.Unlock()
	}
}()

并发同步 WaitGroup

var wg sync.WaitGroup
wg.Add(2) // 计数器
go func() {
	defer wg.Done() //计数器--
  //do something
}()
go func() {
	defer wg.Done()
  //do something
}()
wg.Wait() //计数器为0之前阻塞

Go 依赖

Q 为啥要控制依赖

A不同环境(项目)依赖的版本不同

依赖管理历史: GOPATH ~> Go Vendor ~> Go Module

GOPATH

项目直接依赖于src下面的代码,go get下载最新版本的包在src目录下,无法实现包的多版本控制

Go Vendor

依赖包副本形式存在$ProjectRoot/vendor

依赖寻址:vendor ~>GOPATH

无法控制依赖的依赖的版本(应该无病句

Go Module *
  1. 配置文件,描述依赖 go.mod
  2. 中心仓库管理依赖库(实现稳定的依赖分发) Proxy
  3. 本地工具 go get / mod

Go Module能够定义版本规则和管理项目依赖关系。

对于间接依赖会在require里面用 //indirect标识,对于可能存在不兼容的依赖会用+incompatible标识。

如果同时用到了两个不同版本的间接依赖,会在满足依赖的同时优先选择版本较低的

go module issus

Newest 'go-modules' Questions - Stack Overflow

Modules · golang/go Wiki (github.com)

一些常用命令

go set go111module="on" //开启go module 
go mod init 
go mod download
go mod tidy
go mod verify
go get

测试

回归测试、集成测试、单元测试

单元测试

测试文件命名以_test.go结尾

import(
	"github.com/stretchr/testify/assert"
)
func TestSomething(t *testing.T) {
	output := Something()
	expectOutput := "loomt"
	assert.Equal(t, expectOutput, output)
}

Mock 测试

替换函数、方法

基准测试

分析性能

需求分析

ER图

数据层Repository逻辑层Service视图层Controller
数据Model,外部数据的增删改查业务Entity,处理核心业务逻辑输出视图View,处理和外部的交互逻辑

项目

高并发场景下可以用sync.Once减少时空花费

从数据库(本地)拿数据的流程:参数校验*(避免服务端查询出错) ~> 准备数据(可以用并发同步WaitGroup提高效率) ~> 组装实体

Gin 搭建Web框架

  1. 初始化数据
  2. 初始化引擎配置
  3. 构建路由
  4. 启动服务