前置
本次实验使用 Golang 语言实现,在之前的年份中,都是像 cs186 那样使用 Java 实现。原因:
-
Golang 语言作为现代化语言,简单易上手但功能强大。
-
使参加实验的同学有同一起跑线,而不是像Java那样,有些同学有语言基础有些同学没有。
实验链接🔗: https://github.com/MIT-DB-Class/lab0
实验内容
熟悉基本的Go语言,包括:
-
下载并安装
-
Hello World 程序
-
Error 处理、指针、结构体、数组、map、接口等基本用法。
在熟悉上述内容后,需要按照指引提前下载好 mbta.sqlite 文件并放到代码目录下,最后正式开始实验
-
HTTP
目标是创建一个 http 服务器,补全 handler.go 中的 HomeHandler 函数代码,最终可以通过游览器直接访问到如下页面。
得益于Golang的强大,创建 http 服务器只需要一行代码,这时候直接启动服务,访问 http://localhost:8080 即可,但不会显示上述页面,需要进一步补全 HomeHandler 代码。
-
在 HomeHandler 函数中,首先要打开数据库文件,才能进行后续的读取操作。打开函数已经提供,RidershipDB 接口的 Open 方法, 直接调用即可。
-
打开数据库后要执行查询,而查询的函数也已经提供了,RidershipDB 接口的 GetRidership 方法,直接调用即可。
-
查询得到了一个 int64 数组后, 需要把其转换成展示表格,转换函数也已经提供,utils.GenerateBarChart。
-
最后将所有数据填充到 http 响应体前,需要把数据做一次 base64 转换,这是 http 协议中常用到的规则。转换函数没有提供,通过搜索得知, golang提供了原生的转换方法。
-
最后将所有数据填充到 http 响应体中,肯定是调用 tmpl 对象的某个方法,通过IDE提供的 hint 观察,找到 Execute 函数。
-
SQL over CSV
第二部分,需要从 csv 中而不是文件中读取数据,另外需要将 CsvRidershipDB 对象实验RidershipDB接口。
-
CsvRidershipDB缺少的是 GetRidership 函数和 Close函数,对于 Close 函数直接返回 csvFile.Close() 即可。
-
实现GetRidership方法。打开函数已经提供,RidershipDB 接口的 Open 方法已经被 CsvRidershipDB 对象实现了, 直接调用即可。
-
然后通过 csvReader.ReadAll() 读取全量 csv 数据之后进行循环并解析,需要注意的是要跳过表头,并且列号是从0开始的,全量代码如下。
实验总结
-
掌握如何以最简单化的方式启动 http 服务器并注册路由。
-
Golang中的对象实现接口不像Java中那种用 implement 关键字展示指定,而是只有实现了接口对应的所有方法,才算是接口的实现对象。弊端是阅读代码时不知道对象和接口之间的实现关系,好在有IDE的指示。
-
如何读取 csv 并进行解析。
联系方式
francis_l@qq.com