Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

特别放送 | 给你一份清晰、可直接套用的Go编码规范

最佳实践
依赖管理
GOPATH 设置规范
函数
控制结构
类型
注释规范
命名规范
代码风格
编码规范

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。
我们在上一讲学习了“写出优雅 Go 项目的方法论”,那一讲内容很丰富,是我多年 Go 项目开发的经验沉淀,需要你多花一些时间好好消化吸收。吃完大餐之后,咱们今天来一期特别放送,就是上一讲我提到过的编码规范。这一讲里,为了帮你节省时间和精力,我会给你一份清晰、可直接套用的 Go 编码规范,帮助你编写一个高质量的 Go 应用。
这份规范,是我参考了 Go 官方提供的编码规范,以及 Go 社区沉淀的一些比较合理的规范之后,加入自己的理解总结出的,它比很多公司内部的规范更全面,你掌握了,以后在面试大厂的时候,或者在大厂里写代码的时候,都会让人高看你一眼,觉得你 code 很专业。
这份编码规范中包含代码风格、命名规范、注释规范、类型、控制结构、函数、GOPATH 设置规范、依赖管理和最佳实践九类规范。如果你觉得这些规范内容太多了,看完一遍也记不住,这完全没关系。你可以多看几遍,也可以在用到时把它翻出来,在实际应用中掌握。这篇特别放送的内容,更多是作为写代码时候的一个参考手册。

1. 代码风格

1.1 代码格式

代码都必须用 gofmt 进行格式化。
运算符和操作数之间要留空格。
建议一行代码不超过 120 个字符,超过部分,请采用合适的换行方式换行。但也有些例外场景,例如 import 行、工具自动生成的代码、带 tag 的 struct 字段。
文件长度不能超过 800 行。
函数长度不能超过 80 行。
import 规范
代码都必须用 goimports 进行格式化(建议将代码 Go 代码编辑器设置为:保存时运行 goimports)。
- 不要使用相对路径引入包,例如 import …/util/net 。
- 包名称与导入路径的最后一个目录名不匹配时,或者多个相同包名冲突时,则必须使用导入别名。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文是一份关于Go编码规范的详实指南,作者孔令飞结合多年的Go项目开发经验,总结了包括代码风格、命名规范、注释规范、类型、控制结构、函数、GOPATH设置规范、依赖管理和最佳实践在内的九类规范。其中,强调了代码风格、命名规范、注释规范、类型、控制结构、函数、GOPATH设置规范、依赖管理和最佳实践等内容。对于想要编写高质量Go应用的开发者来说,是一份非常实用的参考手册。文章内容详实,涵盖了Go编码规范的方方面面。包括了文件命名、结构体命名、接口命名、变量命名、常量命名、错误的命名等内容。同时,还介绍了注释规范,包括包注释、变量/常量注释、结构体注释、方法注释、类型注释等。此外,还涉及了字符串、切片、结构体、控制结构等方面的规范。文章内容丰富,对于Go语言开发者来说是一份非常有价值的指南。文章总结了九类常用的编码规范,包括函数、defer、方法的接收器、嵌套、变量命名、GOPATH设置规范、依赖管理、最佳实践等。作者还提醒读者规范是可以根据项目需要制定的,但建议采纳业界沉淀下来的规范,并通过工具来确保规范的执行。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(36)

  • 最新
  • 精选
  • 滴滴答答
    为什么函数参数尽量不用指针传递?如果是一个比较大的结构体,传指针不是更好吗?

    作者回复: 如果传指针存在被意外修改的风险,如果结构体很大,也可以传指针

    2021-06-17
    11
  • NULL
    不认同的地方: 4.1字符串, 空字符串的判断 两种方式都可以 详见: https://stackoverflow.com/questions/18594330/what-is-the-best-way-to-test-for-an-empty-string-in-go 4.2切片, 空 slice 判断 应该是"如果你需要测试一个slice是否是空的,使用len(s) == 0来判断,而不应该用s == nil来判断" 详见Go语言圣经: https://books.studygolang.com/gopl-zh/ch4/ch4-02.html 描述不够准确定地方: 4.2切片, 声明 slice 描述不够准确 详见: https://github.com/golang/go/wiki/CodeReviewComments#declaring-empty-slices 补充: 可以根据需要指定cap, 减少内存分配次数, 降低gc压力, 如 make([]int, 0, 100) 6.函数, 尽量采用值传递,而非指针传递。 描述不够准确 详见: https://github.com/golang/go/wiki/CodeReviewComments#pass-values 6.1 函数参数, 尽量用值传递,非指针传递。 描述不够准确 详见: https://github.com/golang/go/wiki/CodeReviewComments#pass-values 6.函数, 传入参数是 map、slice、chan、interface ,不要传递指针。 描述不够准确, 如果是slice, 并且有append操作, 并且期望改变可以影响原函数, 应当传递指针 这与slice的底层结构有关, 两个value, 一个 pointer 这在"9.2 注意事项"第一条也有说明 详见: https://github.com/golang/go/blob/master/src/runtime/slice.go#L22 9. 最佳实践, 在编译时验证接口的符合性,例如: 描述不够准确 详见: https://github.com/xxjwxc/uber_go_guide_cn#toc8

    作者回复: 6666,我再check下

    2022-07-30归属地:广东
    2
    9
  • 苳冬
    驼峰命名 APIClient、UserID,如果遇到API+ID就是APIID这样连续两个全大写可读性很低啊

    作者回复: 那是不是可以把API换成更具体的API名字呢

    2021-06-24
    3
  • Vackine
    在1.2初始化结构体引用时,给的案例里面bad 和good的sval的方式是一模一样的啊?还有在切片初始化时不都建议提前制定容量,然后后面为什么在声明slice是时候,又不建议make的方式而用var 的方式?

    作者回复: 如果不指定切片的cap,建议用var s []string

    2021-06-17
    3
  • josephzxy
    想问1.2节里为什么“对于未导出的顶层常量和变量,使用 _ 作为前缀。”,有什么作用吗?首字母小写不是已经表明是未导出(unexported)了吗?谢谢!

    作者回复: 比如:_version,看到这种命令方式,你就知道:这是个全局的未导出的变量。可以协助你使用变量,也就是通过变量名,你能知道该变量的作用域以及是否可导出。

    2021-08-05
    4
    2
  • dll
    注释写中文才能说清楚的情况,该怎么规范注释呢

    作者回复: 统一规范即可,要么全写中文,要么全写英文

    2021-06-30
    2
  • Seven
    为方便团队都使用这份规范,需要写到开发文档里。请问这篇规范可以给个GitHub链接吗?这样方便更多人用,当然注明来自本课程也可以让更多人慕名学习。

    作者回复: 目前没有Github链接。我们考虑下,感谢建议。

    2021-06-26
    2
  • Geek_a4cca6
    老师,请问有学习班的群吗?

    作者回复: 有的,看下iam项目/README,有我微信号,加我,我拉你

    2021-06-24
    2
    2
  • Q
    空slice那里为啥要 先判断slice != nil 再判断 len(slice) > 0 呢?不判断不可以吗?

    作者回复: 因为nil的silce,len(slice)也是0。 空slice指的是:slice=make([]int,0)这种情况,也即是:slice不为nil,但长度为0的slice。

    2021-06-19
    4
    2
  • Fan
    请问go web 的项目结构目录有标准吗? 查资料查到一个社区标准(https://github.com/golang-standards/project-layout),但是褒贬不一。所以想问问您那的结构目录是怎么标准化的?

    作者回复: 基本上与这个项目保持一致:https://github.com/golang-standards/project-layout 可以加我微信,我们详细交流下。项目根目录下的README文件中,有我微信号

    2021-07-27
    1
收起评论
显示
设置
留言
36
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部