前言

一主要讲的是容易忽略的错误,可能在build时都不会体现出来但是在使用时出现问题

二主要讲的是一些可以提高代码效率的用法

本篇则讲解一些规范,不是强制的但是根据规范会提高代码的可读性, 减少BUG 等

正文

一致性

最重要的, 项目的参与者要保持代码规范的一致性.无论你的团队使用怎样的代码规范

一致性的代码更容易维护、是更合理的、需要更少的学习成本、并且随着新的约定出现或者出现错误后更容易迁移、更新、修复 bug

相反,一个单一的代码库会导致维护成本开销、不确定性和认知偏差。所有这些都会直接导致速度降低、 代码审查痛苦、而且增加 bug 数量

将这些标准应用于代码库时,建议在 package(或更大)级别进行更改,子包级别的应用程序通过将多个样式引入到同一代码中,违反了上述关注点。

相似的声明放在一组

应当将相似的声明放在一组内



常量/变量/类型声明皆是如此



对于不是相似的,不要放在一组



该规范在函数内也同样适用

import分组

对于import, 应当将导入的第三方模块与自己写的模块分开(go fmt提供了这样的功能)

包名

给包命名时,按照以下规则起名

  • 全部小写.没有大写或者下划线
  • 大多数使用起别名的情况下,不需要重命名
  • 简短与简洁
  • 不使用复数
  • 不要用“common”,“util”,“shared”或“lib”。这些是不好的,信息量不足的名称

导入别名

如果程序包名称与导入路径的最后一个元素不匹配,则必须使用导入别名



当然,如果一切都很标准,则不需要起别名

函数分组与排序

  • 函数应当按照粗略的调用顺序来排序
  • 同一个文件里的函数按照接收者分组

    因此,导出的函数应先出现在文件中,放在struct, const, var定义的后面。

    在定义类型之后,但在接收者的其余方法之前,可能会出现一个 newXYZ()/NewXYZ()

    由于函数是按接收者分组的,因此普通工具函数应在文件末尾出现

减少嵌套

尽量减少代码的嵌套

代码应通过尽可能先处理错误情况/特殊情况并尽早返回或继续循环来减少嵌套.减少嵌套多个级别的代码的代码量.

不必要的 else

如果在 if 的两个分支中都设置了变量,则可以将其替换为单个 if.

顶层变量声明

如果在函数外声明变量时, 已经可以明确变量的类型时无需再次主动声明类型

对于未导出的顶层常量和变量,使用_作为前缀

在未导出的顶级vars和consts, 前面加上前缀_,以使它们在使用时明确表示它们是全局符号。

例外:未导出的错误值,应以err开头。

基本依据:顶级变量和常量具有包范围作用域。使用通用名称可能很容易在其他文件中意外使用错误的值。

结构体嵌入

建立结构体时, 某个字段时嵌套的另一个结构体,那么将它与其他字段分开

使用字段名初始化结构体

在初始化结构体时, 一定要加上字段名



原版说3个字段以内可以省略,我觉得不行

本地变量声明

本地变量声明时使用 :=

如果是声明空切片这种使用 var 会增加可读性时则使用 var

nil是一个slice

要知道, nil是一个长度为0的 slice,所以要注意

  • 不要返回一个空的切片, 返回nil
  • 检查切片是否为空时使用 len(s) == 0 而不是 s == nil
  • 用var声明的切片可直接使用不需 make

减少变量的生效范围

如果变量是私有变量,尽量将变量的作用域变小

避免参数意义不明确

如果参数多不明白参数的意思可以使用 /* */ 方式在代码中打入注释

字符串转义

使用 ........ 来进行字符串的转义

uber_go_guide解析(三)(规范)的更多相关文章

  1. 【原创】分布式之数据库和缓存双写一致性方案解析(三) 前端面试送命题(二)-callback,promise,generator,async-await JS的进阶技巧 前端面试送命题(一)-JS三座大山 Nodejs的运行原理-科普篇 优化设计提高sql类数据库的性能 简单理解token机制

    [原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 ...

  2. Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件

    Fixflow引擎解析(四)(模型) - 通过EMF扩展BPMN2.0元素 Fixflow引擎解析(三)(模型) - 创建EMF模型来读写XML文件 Fixflow引擎解析(二)(模型) - BPMN ...

  3. 【转】C语言文件操作解析(三)

    原文网址:http://www.cnblogs.com/dolphin0520/archive/2011/10/07/2200454.html C语言文件操作解析(三) 在前面已经讨论了文件打开操作, ...

  4. Celery 源码解析三: Task 对象的实现

    Task 的实现在 Celery 中你会发现有两处,一处位于 celery/app/task.py,这是第一个:第二个位于 celery/task/base.py 中,这是第二个.他们之间是有关系的, ...

  5. 完爆Facebook/GraphQL,APIJSON全方位对比解析(三)-表关联查询

    相关阅读: 完爆Facebook/GraphQL,APIJSON全方位对比解析(一)-基础功能 完爆Facebook/GraphQL,APIJSON全方位对比解析(二)-权限控制 自APIJSON发布 ...

  6. Mybatis源码解析(三) —— Mapper代理类的生成

    Mybatis源码解析(三) -- Mapper代理类的生成   在本系列第一篇文章已经讲述过在Mybatis-Spring项目中,是通过 MapperFactoryBean 的 getObject( ...

  7. Spring Security 解析(三) —— 个性化认证 以及 RememberMe 实现

    Spring Security 解析(三) -- 个性化认证 以及 RememberMe 实现   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...

  8. EMV/PBOC解析(三) TLV格式解析(C#)

    1.什么是TLV格式? TLV即Tag-Length-Value,常在IC卡与POS终端设备中通过这样的一个应用通信协议进行数据交换. 金融系统中的TLV是BER-TLV编码的一个特例编码规范,而BE ...

  9. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

随机推荐

  1. 团队展示——Part I

    1. 团队简介 队名:非专业团队

  2. Scrum冲刺_Day03

    一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...

  3. 总括订单Blanket order

    总括订单Blanket order是客户向其供应方发出的采购订单,但其中包含一段时间内的多个交货日期,通常使用谈判时的预定价格.大多数情况下,它用于对消耗性商品有经常性需求的情况.总括订单通常用于客户 ...

  4. AcWing 369. 北大ACM队的远足

    \(\text{Update on 2020.3.25}\) 我之前的做法也有问题,讨论还是不够严谨,导致又有几组(见 打卡评论区)\(\text{Hack}\) 此题数据极水,这里有几种错误写法: ...

  5. 题解-[SDOI2016]征途

    [SDOI2016]征途 [SDOI2016]征途 给定长度为 \(n\) 的序列 \(a\{n\}\),将其分为连续 \(m\) 段,和分别为 \(v\{m\}\).\(v\{m\}\) 的方差为 ...

  6. TimSort源码详解

    Python的排序算法由Peter Tim提出,因此称为TimSort.它最先被使用于Python语言,后被多种语言作为默认的排序算法.TimSort实际上可以看作是mergeSort+binaryS ...

  7. 2020高考倒计时!全屏向下滑动设计HTML源码

    全屏竖向滑动效果,自适应,多终端 全国高考倒计时,音乐自动播放. 背景图片:img目录下替换bg.jpg  背景音乐:audio目录下替换song.mp3 原本按照正常情况下每年的6月7.8日就是全国 ...

  8. Linux修改系统时间为东八区北京时间(上海时间)

    1. Linux时间   Linux的时间分为 System Clock(系统时间)和 Real Time Clock(硬件时间,简称RTC).   系统时间:指系统内核中的时间.   硬件时间:指主 ...

  9. Java字节码中对应的JDK版本

    Java class vs. JDK version mapping Java SE 9 = 53,Java SE 8 = 52,Java SE 7 = 51,Java SE 6.0 = 50,Jav ...

  10. 七轮面试最终拿下阿里offer —— 十年经验之谈

    前言 今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个"五年计划"截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了.但 ...