这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
Go语言进阶
通过go关键字可以实现go协程的开启。Go语言提倡通过通信共享内存,而不是使用共享内存实现通信。
Go中使用channel实现通信,下面是示例:
make(chan int) //无缓冲
make(chan int,2) //有缓冲
对于channel的内容遍历,可以使用for循环进行提取。
for i := range dest {
//do something
}
为了实现优雅关闭,可以使用WaitGroup进行关闭。常用的方法有:
Add(delta int)
Done()
Wait()
开启协程加1,执行结束减1,主协程阻塞直到计数器为0。
依赖管理
Go的依赖管理从GOPATH->Go Vendor->Go Module。这里重点对Go Moudle进行介绍。 通常获得一个项目后可以根据以下代码进行依赖的安装:
go mod tidy
在安装第三方依赖时通常会设置代理来减少对第三方的压力。
测试
Golang含有丰富的测试库,可以对代码进行有效的测试。这里介绍三种测试:单元测试,Mock测试以及基准测试。
单元测试
测试文件以_test结尾,文件能的测试函数以Test开头。初始化逻辑在TestMain函数中:
func TestMain(m *testing.M) {
//beore
code:=m.Run()
//after
os.Exit(code)
}
func TestHelloTom(t *testing.T){
output :HelloTom()
expectoutput :"Tom"
assert.Equal(t,expectoutput,output)
}
单元测试的覆盖率,衡量代码经过足够的测试。在运行go test后添加--cover即可。
Mock测试
monkey github.com/bouk/monkey
func TestProcessFirstLineWithMock(t *testing.T)
monkey.Patch(ReadFirstLine,func()string
return "line110"
)
defer monkey.Unpatch(ReadFirstLine)
line :=ProcessFirstLine()
assert.Equal(t, expected:"line000",line)
66
基准测试
函数头使用Benchmark
项目实战
需求描述:
社区话题页面
- 展示话题 (标题,文字描述) 和回帖列表
- 暂不考虑前端页面实现,仅仅实现一个本地web服务
- 话题和回帖数据用文件存储
包含了两个对象,一个是话题(topic),另一个是回帖(post)
首先需要对需求进行分层,整体分成三层,repository数据层,service逻辑层,controller视图层。数据层关联底层数据模型,封装外部数据的CRUD。逻辑层处理业务逻辑,根据需求编写函数供视图层使用。最后视图层负责与外部逻辑进行交互,常常是封装json格式,api形式进行访问。
service层还会考虑性能,对数据进行适当的并行处理。 在对三层的编码完成后设置路由供外部访问。