Go语言进阶实战 | 青训营笔记

97 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 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
}