美文网首页
go 语言项目规范

go 语言项目规范

作者: wayyyy | 来源:发表于2021-10-15 09:33 被阅读0次

命名规范

  • 包名必须和目录名一致,尽量采取有意义、简短的包名,不要和标准库冲突。
  • 包名全部小写,没有大写或下划线,使用多级目录来划分层级。
  • 项目名可以通过中划线来连接多个单词。
  • 包名以及包所在的目录名,不要使用复数,比如 net/utl 而不是 net/urls。
  • 不要用 common、util、shared 或者 lib 这类宽泛的、无意义的包名。
  • 包名要简单明了,例如 net、time、log。
函数

函数名采用驼峰式,首字母根据访问控制决定使用大写或小写。

文件

文件名要简短有意义,应小写并使用下划线分割单词。

结构体
  • 采用驼峰命名方式,首字母根据访问控制决定使用大写或小写,例如 MixedCaps 或者 mixedCaps。
  • 结构体名不应该是动词,应该是名词,比如 Node、NodeSpec。
  • 避免使用 Data、Info 这类无意义的结构体名。
  • 结构体的声明和初始化应采用多行:
    // User 多行声明
    type User struct {
        Name  string
        Email string
    }
    
    // 多行初始化
    u := User{
        UserName: "colin",
        Email:    "colin404@foxmail.com",
    }
    
接口

基本和结构体命名规则保持一致:

  • 单个函数的接口名以 “er”作为后缀(例如 Reader,Writer),有时候可能导致蹩脚的英文,但是没关系。
  • 两个函数的接口名以两个函数名命名,例如 ReadWriter。
  • 三个以上函数的接口名,类似于结构体名。
变量
  • 变量名必须遵循驼峰式,首字母根据访问控制决定使用大写或小写。
  • 在相对简单(对象数量少、针对性强)的环境中,可以将一些名称由完整单词简写为单个字母,比如:user 可简写为 u;userID 可简写 uid。
  • 对于私有特有名词为首个单词则使用小写(如 apiClient)。其他特有名词都应当使用该名词原有的写法,如 APIClient、repoID、UserID。
  • 若变量类型为 bool 类型,则名称应以 Has,Is,Can 或 Allow 开头。
  • 局部变量应当尽可能短小,比如使用 buf 指代 buffer,使用 i 指代 index。
常量

常量名必须遵循驼峰式,首字母根据访问控制决定使用大写或小写

Error

Error 类型应该写成 FooError 的形式,比如 type ExitError struct {}
Error 变量写成 ErrFoo 的形式,比如 var ErrFormat = errors.New("unknown format")


注释规范


日志规范

  • 打印日志

    • 在分支语句处打印。可判断出代码走了哪个分支,有助于判断请求的下一跳,继而继续排查问题。
    • 写操作必须打印。写操作最可能引起比较严重的业务故障,写操作打印日志可在出问题时找到关键信息。
    • 在循环中打印要慎重。如果循环次数过多会导致打印大量日志,严重拖累代码的性能,建议在循环中记录要点,在循环外面总结打印。
    • 在错误产生的最原始位置打印。对于嵌套 Error,可在 Error 产生的最初位置打印 Error 日志,上层如果不需要添加必要的信息,可直接返回下层 Error(减少重复的日志打印)。
  • 日志级别

    • Debug:在开发测试阶段打印最详尽的信息(比如整个 HTTP 请求/响应的 Body)有助于 Debug,由于可能会严重拖慢性能,在上线时必须禁用。
    • Info:记录有助于运营分析的有用信息,目标是满足需求但不至于日志量太大、频度过高。
    • Warn:提示程序异常,一般是业务层面上不符合预期但不影响继续运行,或暂时影响但后续会恢复的情况。
    • Error:提示程序出错(大部分),比如请求失败、创建资源失败等。需要记录以避免日后排障过程中被忽略。
    • Panic:实际开发中很少用,通常只在需要错误堆栈,或不希望发生严重错误导致程序退出而采用 defer 处理错误时使用。
    • Fatal:实际开发中很少用,此时问题相当严重,导致整个程序无法运行。
  • 日志内容

    • 避免输出敏感信息,例如密码、密钥等。
    • 为方便调试,通常在 Debug 级别记录临时日志,可以特殊字符开头,比如 log.Debugf("XXXXXXXXXXXX-1:Input key was: %s", setKeyName)。完成调试后可查找 XXXXXXXXXXXX 字符串找到临时日志,commit 前删除。
    • 以小写字母开头,以 . 结尾,比如 log.Info("update user function called.")
    • 为了提高性能,尽可能明确类型,例如使用 log.Warnf("init datastore: %s", err.Error()) 而非 log.Warnf("init datastore: %v", err)
    • 最好包含两个信息。请求 ID(每次请求的唯一 ID可放在请求的通用日志字段中,便于过滤出某次请求)以及用户和行为(标识谁做了什么)。
    • 避免将普通日志记录在错误级别上。
  • 日志内容

    • 避免输出敏感信息,例如密码、密钥等。
    • 为方便调试,通常在 Debug 级别记录临时日志,可以特殊字符开头,比如 log.Debugf("XXXXXXXXXXXX-1:Input key was: %s", setKeyName)。完成调试后可查找 XXXXXXXXXXXX 字符串找到临时日志,commit 前删除。
    • 以小写字母开头,以 . 结尾,比如 log.Info("update user function called.")
    • 为了提高性能,尽可能明确类型,例如使用 log.Warnf("init datastore: %s", err.Error()) 而非 log.Warnf("init datastore: %v", err)
    • 最好包含两个信息。请求 ID(每次请求的唯一 ID可放在请求的通用日志字段中,便于过滤出某次请求)以及用户和行为(标识谁做了什么)。
    • 避免将普通日志记录在错误级别上。
  • 实践

    • 开发调试、现网故障排障时,根据排障的过程优化日志打印。
    • 避免打印无用日志,也不要遗漏关键信息,目标是仅凭借关键日志就能定位到问题。
    • 总是将记录在本地文件,与日志平台解耦(确保中间出错时仍能记录日志)。
    • 应用可能包含多个服务,一个服务包含多个实例,应集中化日志存储处理。
    • 结构化日志记录,即添加默认通用字段到每行日志,方便日志查询和分析。包括:时间(精确到微秒),文件名-函数-行号,日志级别。如果是错误,还需要把调用栈打出来。
    • 日志可分布在不同的组件、机器上,使用 RequestID 串联请求日志可提高排障效率。
    • 支持动态开关 Debug 日志,可避免为排查问题调整日志级别时重启服务。

版本规范

一般使用 语义化版本规范(SemVer,Semantic Versioning),即 主版本号.次版本号.修订号(X.Y.Z,其中 X、Y 和 Z 为非负的整数,且禁止在数字前方补零)。

  • 主版本号(MAJOR):不兼容的 API 修改。
    • 必须在有任何不兼容的修改被加入公共 API 时递增。其中可以包括次版本号及修订级别的改变。每当主版本号递增时,次版本号和修订号必须归零。
    • 主版本号为零(0.y.z)的软件处于开发初始阶段,由于一切都可能随时被改变,不应该被视为稳定版。1.0.0 被界定为第一个稳定版本,之后的所有版本号更新都基于该版本修改。
  • 次版本号(MINOR):向下兼容的功能性新增及修改。一般偶数为稳定版本,奇数为开发版本。在任何公共 API 功能被标记为弃用时也必须递增,当有改进时也可以递增。其中可以包括修订级别的改变。每当次版本号递增时,修订号必须归零。
  • 修订号(PATCH):向下兼容的问题修正,即 bug 修复。

项目目录结构规范


git commit 规范

TODO


Git Flow

TODO


其他可参考的文章:

1、https://mp.weixin.qq.com/s/ZiWTxLAhw-aJxHQBUG_9YA
2、Go 语言实践:编写可维护的程序的建议

相关文章

  • 项目开发过程中的管理规范

    平台项目管理规范(Go语言版本) 1 编码规范 go版本go1.13.4开发环境linux/mac/wind...

  • Go 项目开发过程中的管理规范

    平台项目管理规范(Go语言版本) 1 编码规范 go版本go1.13.4开发环境linux/mac/wind...

  • go 语言项目规范

    记录几篇文章: 1、腾讯发布了Go语言代码安全指南[https://zhuanlan.zhihu.com/p/40...

  • ByteEdu Go语言基础+视频教程

    第一节 Go语言简介 + Go语言编码规范 视频地址:Go语言简介 第二节 Go语言环境安装 ...

  • Go语言规范

    目录 统一规范篇 命名篇 开发篇 优化篇 统一规范篇 本篇主要描述了公司内部同事都必须遵守的一些开发规矩,如统一开...

  • go fmt与gofmt命令

    go fmt命令会按照Go语言代码规范格式化指定代码包中的所有Go语言源码文件的代码,所有Go语言源码文件即包括命...

  • Uber Go 语言编码规范

    Uber Go 语言编码规范[https://github.com/xxjwxc/uber_go_guide_cn]

  • Golang语言编程规范

    一.说明 编程规范好,可避免语言陷阱,可有利团队协作,有利项目维护。 正常的Go编程规范有两种:编译器强制的(必须...

  • Uber Go 风格指南中文版

    uber_go_guide_cn Uber Go语言编码规范 Uber是世界领先的生活出行服务提供商,也是Go语言...

  • 哥哥带你学Flutter 140+ 组件

    Dart语言规范 Flutter Go 开发规范 Elements Form 1,Input 输入框TextFie...

网友评论

      本文标题:go 语言项目规范

      本文链接:https://www.haomeiwen.com/subject/qoijwltx.html