Go语言初学记 (二): 实现篇
原文再续
上一篇 Go语言初学记 (一): 启动篇 介绍了准备开发环境的步骤, 可以开始实行我的 kanban 项目了 !
初步设计
kanban 项目要通过命令行来实现经典的看板管理, 初步的设计如下:
测试驱动开发
Test Not GOOD X , TDD GOOD √
有了设计就可以开始编码了, 作为一个 TDD 理念的实践者,我第一个要实现是实体 task 的测试.
go 的测试文件需以_test 结尾, new file : task/Task_test.go
具体步骤
- 声明包 task
- 引入测试包 testing
- 测试方法 Test 开头,固定参数(t *testing.T)
- 运行测试,失败
- 实现代码
- 循环 4~5,直至测试完成
测试代码
1 | package task |
实现代码
1 | package task |
方法测试
通过 IDE 可以很方便测试单个方法
1 | Running tool: /usr/local/go/bin/go test -timeout 30s kanban/task -run ^(TestTask)$ |
包测试
完成一堆测试用例的时候,可以运行包测试,从结果上可以看到测试的覆盖率
1 | Running tool: /usr/local/go/bin/go test -timeout 30s -coverprofile=/var/folders/yn/h224dtzx2bq3pdhhgv4jt93r0000gn/T/vscode-gocVUxCQ/go-code-cover kanban/task |
接口 : interface
go没有类class的设定,函数func是一等公民,想要实现类似封装的功能需要靠接口interface来实现.
我把操作task 相关的操作封装在 TaskService 里,定义如下:
定义接口
1 | //TaskService interface |
定义实现方式
定义了接口,就会有有多种实现方式.
为了实现其中一种实现方式,先定义实现方式,本项目以文件的形式来存储任务,所以定义:1
2
3//FileWay desc
type FileWay struct {
}
具体实现
具体实现里在 func里加入(t *FileWay)来声明具体实现那种方式.
1 | func (t *FileWay) createTask(taskName string) Task { |
具体调用
测试用例已经包含了具体的调用代码,测试即文档还是有点道理的.
1 | func TestCreateTask(t *testing.T) { |
To be continue
在学习接口的时候,我经历了种种不适应, 比起java的接口,go的接口要复杂一点.
在完成 task 包里的种种测试之后,我开始有点小得意了,殊不知已经给自己后面的工作埋了个大坑…..