Go语言进阶 | 青训营笔记

177 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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

项目实战

需求描述:

社区话题页面

  1. 展示话题 (标题,文字描述) 和回帖列表
  2. 暂不考虑前端页面实现,仅仅实现一个本地web服务
  3. 话题和回帖数据用文件存储

包含了两个对象,一个是话题(topic),另一个是回帖(post)

首先需要对需求进行分层,整体分成三层,repository数据层,service逻辑层,controller视图层。数据层关联底层数据模型,封装外部数据的CRUD。逻辑层处理业务逻辑,根据需求编写函数供视图层使用。最后视图层负责与外部逻辑进行交互,常常是封装json格式,api形式进行访问。

service层还会考虑性能,对数据进行适当的并行处理。 在对三层的编码完成后设置路由供外部访问。