这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
2023.01.16 青训营第二天,强度逐渐上来了,不过都给了代码,有些不懂的地方需要自己多敲两遍。
收获1:测试
单元测试
覆盖率测试尽量50%-60%以上,80%为较高。
Mock
使用monkey(老师仓库的代码应该不支持M1的ARM架构),使用Patch和Unpatch函数来Mock掉真正的接口,这样测试文件就不会对外面产生依赖,这个行为叫打桩。
基准测试
基准测试是在本机跑一下速度。
fastrand比rand快,但牺牲一些随机性,多并发可以考虑。
收获2:社区话题页面和回帖列表
数据层
Topic和Post两个结构体和相关查询。
逻辑层
参数边界条件判断,获取topic信息和对应post列表,打包信息pageInfo。
视图层
err != nil就展示信息,否则返回错误码和信息。
server
起Gin的http服务。
curl访问,返回json。
最后返回的json如果在终端里依托答辩可以安装nodejs的json包,在命令后加上" | json"会格式化。同样也可以选择python自带的。
总结
第二天青训营 ✅ 还是要手多敲不能懒
db_init.go
package repository
import (
"bufio"
"encoding/json"
"os"
)
var (
topicIndexMap map[int64]*Topic
postIndexMap map[int64][]*Post
)
func Init(filePath string) error{
if err := initTopicIndexMap(filePath);err!=nil{
return err
}
if err := initPostIndexMap(filePath);err!=nil{
return err
}
return nil
}
func initTopicIndexMap(filePath string) error {
open, err := os.Open(filePath + "topic")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
topicTmpMap := make(map[int64]*Topic)
for scanner.Scan() {
text := scanner.Text()
var topic Topic
if err := json.Unmarshal([]byte(text), &topic); err != nil {
return err
}
topicTmpMap[topic.Id] = &topic
}
topicIndexMap = topicTmpMap
return nil
}
func initPostIndexMap(filePath string) error{
open, err := os.Open(filePath + "post")
if err != nil {
return err
}
scanner := bufio.NewScanner(open)
postTmpMap := make(map[int64][]*Post)
for scanner.Scan() {
text := scanner.Text()
var post Post
if err := json.Unmarshal([]byte(text), &post); err != nil {
return err
}
posts, ok := postTmpMap[post.ParentId]
if !ok {
postTmpMap[post.ParentId] = []*Post{&post}
continue
}
posts = append(posts, &post)
postTmpMap[post.ParentId] = posts
}
postIndexMap = postTmpMap
return nil
}