MIT6.5830 Lab0-Go tutorial实验记录(四)

2023-10-19 22:12

本文主要是介绍MIT6.5830 Lab0-Go tutorial实验记录(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MIT6.5830 Lab0-Go tutorial实验记录(四) – WhiteNight's Site

Lab0的最后一步–对.csv文件进行查询。

实验步骤

更改handlers.go

那么首先修改下handlers中的方法,毕竟现在不是从sqlite中查询数据了。

// TODO: some code goes here
// Get the chart data from RidershipDB
db.Open("C:/Users/LENOVO/Desktop/Github/lab0/mbta.csv")
chartdata, err := db.GetRidership(selectedChart)
defer db.Close()

仔细看下其他部分的代码,貌似都不用改,那么handlers处理完毕。

实验步骤

观察csv_ridership_db.go

本次实验最难的地方来了。

打开csv_ridership_db,可以看到Open函数已经很贴心的帮你写好了。而Close和GetRidership很明显要自己补齐了。

Close很简单,直接csvFile.close,完事。

// Close implements RidershipDB.
func (c *CsvRidershipDB) Close() error {//panic("unimplemented")err := c.csvFile.Close()if err != nil {return err}return nil
}

但是GetRiderShip要补齐什么呢?没说。这里唯一的提示就是末尾的两行注释,但这两行注释一点用都没有

// TODO: some code goes here
// Implement the remaining RidershipDB methods

那只能靠自己琢磨了。首先根据任务1在sqlite中执行查询的过程。GetRiderShip接收要查询的lineId,并且最后应该返回一个int64类型的切片。我们先读取sqlite打个断点看看这个返回的切片是什么。

可以看到返回的直接就是xx线路分别在9个时间段的客流量。

我们再对照一下SQL语句和csv文件。

可以看到,total_ons就是xx线路在xx时间的xx站的客流量。direction?没用到。station_id?也没用到。那么我们要做的就是”根据time_period_xx,求xx线路在此时间的客流量总和,并且这个客流量和所在站台和线路的行驶方向无关“。

有了个大概思路。我们接下来看看CsvRiderShip的代码。发现有个idIdxMap。我们先把GetRiderShip的返回值设为nil,然后打上断点看看它是干什么的

可以看到idIdxMap是一个Map,其中key的类型为string,value的类型为int,而且key为时间间隔。那么我们可以想到:查询某个line的id,匹配之后根据Map的key将客流量插入Map对应的位置中。

我们重新回到readme.md看看实验要求。

Instead of issuing the query against sqlite, `CsvRidershipDB` directly runs it over the `mbta.csv` CSV file.
MBTA divides a day into nine different time periods (*time_period_01*, ..., *time_period_09*). The CSV file contains how many passengers boarded trains during a specific time period, at a specific station and for a specific line and direction. For the queried line (passed to `GetRidership`) compute the total number of passengers that boarded a train for each given time period (for each time period, sum over all stations and directions). The sum for each time period should be an entry in the returned `int64` slice.
Make sure to use the `idIdxMap` map to map the time period id strings (e.g. *time_period_01*) to the correct index in the `boardings` slice (e.g. 0).

和我们的思路差不多,有了思路接下来就可以开始补全代码了。

实验步骤

补全CsvRiderShip

先写个ReadALL把csv的内容转换为字符串。然后调试看看

写者注

从良了,再也不敢不写return err了。文章篇幅长点就长点吧,但是不写这个调试起来真的很麻烦。

接下来新建个int64的切片,且长度为9,用来存储9个时间段的客流量。

// GetRidership implements RidershipDB.
func (c *CsvRidershipDB) GetRidership(lineId string) ([]int64, error) {//panic("unimplemented")boardings := make([]int64, c.num_intervals)records, err := c.csvReader.ReadAll()if records == nil {return nil, err}return ridershipData, nil
}

剩下的不就是写个for循环然后一行一行去匹配嘛,还是不难理解的。不过这里需要注意实验要求

Make sure to use the `idIdxMap` map to map the time period id strings (e.g. *time_period_01*) to the correct index in the `boardings` slice (e.g. 0).

idIdxMap的key就是时间段(“time_period_xx“),而对应的value为0-9,其实就是让你把idIdxMap[key]的值当boardings的下标用。该说是设计巧妙还是难以理解呢…可能两者都有吧。

还有点需要注意的是,records[4]读取的total_one肯定是string类型的,需要转换为int类型的。因为最后返回的切片类型是int64,所以这里不能用strconv.Atoi,只能用strconv.PraseInt指定把它转换为int64的十进制数。

// GetRidership implements RidershipDB.
func (c *CsvRidershipDB) GetRidership(lineId string) ([]int64, error) {//panic("unimplemented")boardings := make([]int64, c.num_intervals)for {records, err := c.csvReader.Read()if err != nil {if err == io.EOF {break}return nil, err}if records[0] == lineId {sum, err := strconv.ParseInt(records[4], 10, 64)if err != nil {return nil, err}boardings[c.idIdxMap[records[2]]] += sum}}return boardings, nil
}

跑一下看看,浏览器输入localhost:8080,正常访问!第一次感觉到做完实验原来能这么爽。

别忘了go test!

实验总结

Go:从入门到入门

lab0的实验记录就到这里了。感觉go的旅途才刚刚开始…刚看了下后面几个lab,貌似是要实现一个DBMS,嗯…边做边学吧。

要说学到了什么吧,主要是一些API的用法。还有断点和err这两个一定不能忘,调试就全靠这两个了。

这篇关于MIT6.5830 Lab0-Go tutorial实验记录(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/242698

相关文章

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

go 指针接收者和值接收者的区别小结

《go指针接收者和值接收者的区别小结》在Go语言中,值接收者和指针接收者是方法定义中的两种接收者类型,本文主要介绍了go指针接收者和值接收者的区别小结,文中通过示例代码介绍的非常详细,需要的朋友们下... 目录go 指针接收者和值接收者的区别易错点辨析go 指针接收者和值接收者的区别指针接收者和值接收者的

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

go中空接口的具体使用

《go中空接口的具体使用》空接口是一种特殊的接口类型,它不包含任何方法,本文主要介绍了go中空接口的具体使用,具有一定的参考价值,感兴趣的可以了解一下... 目录接口-空接口1. 什么是空接口?2. 如何使用空接口?第一,第二,第三,3. 空接口几个要注意的坑坑1:坑2:坑3:接口-空接口1. 什么是空接