Go语言初学记 (三): 踩坑篇
原文再续
上一篇 Go语言初学记 (二): 实现篇 实现了 task 包的基本功能和测试覆盖,是时候实现另外一个包 ban 了.
目标与准备
ban 包需要实现和文件系统的操作, 以读取 02-doing 列的数据为例,需要实现 2 个步骤:
- 读取目标目录下所有文件的名字
- 过滤符合格式的任务名字
我预先准备单元测试所需要的数据,2个符合格式的任务文件和一个不符合格式的.
步骤 1:读取目标目录下所有文件的名字
期望的测试:
1 | package ban |
具体实现:
1 | package ban |
debug 模式运行,打印日志
1 | API server listening at: 127.0.0.1:22211 |
运行结果与期待一致,步骤 1 done.
只是没想到实现步骤 2 的时候,困扰了我很久.
步骤2. 过滤符合格式的任务名字
从步骤 2 开始,我需要引用 task 包里的接口与结构体了.
期望的测试:
1 | package ban |
具体实现:
1 | package ban |
运行结果却并不理想1
2
3
4
5
6
7
8
9
10Running tool: /usr/local/go/bin/go test -timeout 30s kanban/ban -run ^(TestReadCorrectTask)$
# kanban/ban [kanban/ban.test]
/Users/Antinomy/Github/kanban/ban/KanbanService.go:7:45: undefined: kt
/Users/Antinomy/Github/kanban/ban/KanbanService.go:8:15: undefined: Task
/Users/Antinomy/Github/kanban/ban/KanbanService.go:10:9: undefined: TaskService
/Users/Antinomy/Github/kanban/ban/KanbanService.go:10:27: undefined: FileWay
/Users/Antinomy/Github/kanban/ban/Kanban_test.go:24:18: undefined: Task
FAIL kanban/ban [build failed]
FAIL
很明显ban包的代码无法识别的task包里的对象,导致无法运行.
后来发现,编辑器会自动去掉 import 里的 “kanban/task”,经过一番折腾,修改 “kanban/task” 为 kt “kanban/task”,
task 包才被成功识别. 看来 go 的包引用并没有我想象中那么智能.
1 | import ( |
修改完毕,运行结果:
1 | /Users/Antinomy/Github/kanban/ban/KanbanService.go:14:8: ts.isATask undefined (cannot refer to unexported field or method isATask) |
原来go 接口里,方法名小写开头代表包内可见,方法名大写开头才能包外可见. (我在上一篇文章埋的坑,在这里就踩到了,囧 )
1 | //TaskService interface e |
修改完毕, 运行测试, 通过!
1 | Running tool: /usr/local/go/bin/go test -timeout 30s -coverprofile=/var/folders/yn/h224dtzx2bq3pdhhgv4jt93r0000gn/T/vscode-gocVUxCQ/go-code-cover kanban/ban |
To be continue
到此为止,我学到了:
- 引用别的包的时候需要显式指定包内对象
- 开发给包外使用的接口需要大写开头