Go学习第三课 | 青训营笔记

39 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

一、重点内容

  • 高质量编程

二、高质量编程

  1. 编码规范:注释
    • 注释能够解释代码作用——注释公共符号
      • 公共符号:变量、常量、函数以及结构
      • 既不明显也不简短的公共功能必须注释
      • 库中任何函数都必须注释
      • 不需要注释实现接口的方法
    • 做了什么——注释实现过程
    • 实现的原因——解释代码的外部因素,提供额外的上下文
    • 什么情况会出错——解释代码的限制条件
  2. 编码规范:命名
    • 变量——简洁、缩略词全大写、需要更多上下文信息
    • 函数名——包名和函数名成对出现
    • 包——不要与标准库同名
  3. 编码规范:控制流程
    • 避免嵌套
    • 优先处理错误情况和错误情况
  4. 编码规范:错误和异常处理
    • 简单错误:优先使用errors.New
    • 错误的Wrap :在错误链上获取特定种类的错误,使用errors.As
    • panic:业务代码中不建议使用;当程序启动阶段发生不可逆转的错误时,可以在main函数中使用panic
    • recoverrecover只能在被defer的函数中使用,嵌套无法生效,只能在当前goroutine生效

三、实践部分

昨日的项目结构实践

  • 设计要点:设置全局变量topicNextId用于计数
  • 设计目的:保证topicid不重复且唯一
  • 实现过程:在读取相关文件的过程中,默认情况下id自增,此时不断更新topicNextId的值,直至文件读取完毕,再次更新topicNextId,使得之后获取topic信息并append至文件末尾时,能够使用最新且唯一的id
func initTopicIndexMap(filepath string) error {
    topicNextId = 1
    open, err := os.Open(filepath)
    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
        topicNextId = topic.Id
    }
    topicNextId++
    topicIndexMap = topicTmpMap
    return nil
}

四、个人总结

时间紧,任务重,在项目实践中花费了不少时间,后续会继续补习,尽量跟上进度。