【青训营】Go的高质量编程

2023-05-16

Go的高质量编程

本文内容总结自字节跳动青年训练营 第五届 后端组

什么是高质量?

  • 各种边界条件是否完备
  • 异常情况能正常处理,稳定性有保障
  • 易读易维护

Go语言开发者Dave Cheney指出,编程需要遵循以下原则:

简单性

  • 消除多余的复杂性,以简单清晰的逻辑编写代码
  • 无法理解的代码意味着无法修复和改进

可读性

  • 代码是给人看的
  • 编写可维护代码的第一步是确保代码可读

生产力

  • 团队整体工作效率很重要

一、注释

  • 包中生命的每个公共符号,包括变量、函数以及结构体都要注释
  • 任何既不明显也不简短的公共功能 都要注释
  • 无论长度或者复杂程度,库中任何函数都需要进行注释
  • 实现接口的函数不需要注释

gofmt是Go语言官方提供的工具,能够自动格式化Go语言代码为官方统一风格,一般的IDE比如GoLand直接内置并且默认开启gofmt

除了gofmt之外还有goimport,实际上等于gofmt加上依赖包管理,会自动增删依赖包的引用并且按照字母排序并分类


注释需要: 解释代码作用、代码的逻辑、代码实现的原因、在什么情况下会出错

1.解释代码的作用

在功能和逻辑不太明显的情况需要额外注释,而对于逻辑清晰的比如:

for e := range elements{
    process(e)
}

可以不需要注释

2.注释代码的实现原因
对于注释,我们应该解释代码实现的原因,另外还可以解释代码的外部因素,和额外的上下文关系

3.注释代码出错的原因
适合解释代码的限制条件,比如对于将字符串转化为时间格式的方法

image.png
那么上面则解释了传入非法的、不符合格式的字符串会触发什么异常

4.公共符号始终要注释

小结
总而言之,代码就是最好的注释,而注释需要提供代码未表达的上下文信息

二、命名

1.变量名

  • 简洁胜于冗长
  • 缩略词全大写,但是如果位于变量头则全小写
  • 变量距离其被使用的地方越远,则需要携带更详细的信息

比如:

for i := 0; i < 10; i++ {
   process()
}


for index := 0; index < 10; index++ {
   process()
}

上述例子中,i和index作用域仅限于for内部,因此index的额外长度几乎没有增加对程序的理解,因此使用更短的i是更适合的

还有一个例子,新建一个接受截止时间的函数:

func(c *Client) send(req *Request, deadline time.Time)

func(c *Client) send(req *Request, t time.Time)

上述例子中,deadline可以更详细描述变量作用,因此比t更适合

2.函数名

  • 函数名不懈怠包名已有的上下文信息,因为包名和函数名会一起出现
  • 函数名尽量简短
  • 当名为foo的包的某个函数返回的类型T并不是Foo的时候,可以在返回的函数名中加入类型信息

比如在http包中有一个创建服务的函数,有以下两种命名:

func Serve(l net.Listener, handler Handler)
func ServeHTTP(l net.Listener, handler Handler)

其中,要调用这个函数分别是使用http.Serve和http.ServeHTTP。我们发现http.ServeHTTP对于http重复描述了,实际上不够好,更合适的命名方式为http.Serve

3.包名

  • 只使用小写字母组成,不包含大写字母和下划线
  • 简短并包含一定上下文信息
  • 不要和标准库同名

小结

核心目标是降低阅读理解代码的成本,重点考虑上下文名称,设计简洁清晰的名称

三、流程控制

1.避免嵌套,保证流程清晰

image.png

如果两个分支中都有return,则需要去除冗余的else

2.复杂的控制流程,优先处理错误和特殊情况,尽早返回或者继续循环来减少嵌套

也就是要尽量的扁平,减少嵌套层数

3.小结

  • 线性原理,处理逻辑尽量走直线,避免复杂的嵌套分支
  • 故障问题大多出现在复杂的条件语句和循环语句中

四.错误和异常

1.简单错误
只出现一次的错误,而且在其他地方都不需要捕获该错误。优先使用errors.New来创建匿名变量直接表示简单错误,如果有格式化要求则使用fmr.Errorf

func defaultCheckRedirect(req *Request, via []*Request) error{
    if len(Via) >= 10{
        return errors.New("stopped after 10 redirects")
    }
    return null
}

2.错误的Wrap和Unwarp
这是错误的包装和解包,这可以使得一个错误嵌套另外一个错误,从而形成错误链条,方便跟踪排查问题。在fmt.Errorf中使用%w的关键字将一个错误关联到错误链中

3.错误判定
使用errors.Is判断错误

使用errors.As在错误链上获取指定类型的错误

4.painc
painc错误是一种严重的异常,用于指明一些程序已无法继续运行的严重错误。

5.recover

6.defer

defer是后进先出的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【青训营】Go的高质量编程 的相关文章

  • 设计模式详解:单例模式

    本篇来看一下创建型模式中最常用的第三种模式 xff1a 单例模式 仍然是先看两张图 xff0c 复习模式类型 xff0c 加深记忆 定义 xff1a 单例模式 xff1a 确保一个类 只有一个实例 xff0c 并提供一个 全局访问点 来访问
  • React 中的副作用函数 useEffect 使用说明

    React 中的函数式组件为了能够Hook相应的阶段 xff0c 采用 useEffect函数 xff0c 以实现类 xff08 class xff09 组件的componentDidMount xff0c componentDidUpda
  • stm32——3、键盘

    这里用到的是正点原子开发板 可以看到键盘通过PE2 PE3 PE4 PA0来连接 如果你的开发板不是这个需要改到对应的接口啊 另外可以看到WK UP是高电平有效的 xff0c 并且外部没有上下拉电阻 xff0c 需要stm32内部设置上下拉
  • stm32——4、中断exti

    这里是基于正点原子开发板的学习记录 首先你要加入固件库 stm32f10x exti h 和 stm32f10x exti c 1 STM32中每个io口都可以作为外部中断的中断输入口 2 STM32F103的中断控制器支持19个外部中断
  • Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)

    Android Q获取设备唯一ID xff08 UDID GUID UUID SSAID GAID xff09 一 简介1 1 问题背景1 2 关键技术 二 解决方案2 1 谷歌官方推荐方案 4种 2 2 实现方案1 GUID方案2 3 实
  • @RunWith(SpringRunner.class)测试SpringRunner.class找不到报红的解决办法

    SpringRunner报红无法添加类 上pom xml文件中去掉scope标签内容即可 如下图所示 问题解决
  • 搭建Hadoop分布式集群的详细教程

    目录 写在前面 一 创建虚拟机 xff0c 安装Centos 二 VMware VMnet8模式共享主机网络配置 三 克隆集群节点HadoopSlave1与HadoopSlave2 四 Linux系统配置 五 Hadoop的部署配置 六 H
  • PTA基础编程题 7-26单词长度 (15 分)

    题目 xff1a 你的程序要读入一行文本 xff0c 其中以空格分隔为若干个单词 xff0c 以 结束 你要输出每个单词的长度 这里的单词与语言无关 xff0c 可以包括各种符号 xff0c 比如it 39 s算一个单词 xff0c 长度为
  • 单链表逆置(头插法图解)

    算法思想 xff1a 首先将头结点摘下 xff0c 重新构造链表 xff0c 然后原链表中的结点依次头插到新链表中 xff0c 如此循环 xff0c 直到链表为空 xff0c 即可逆置链表 代码 xff1a 链表逆置 include lt
  • Java-如何理解new A();

    在leetcode 541 反转字符串中有这样一种解法 xff1a public class reverse string public static String reverseStr String s int k char ch 61
  • C++中main函数如何调用类内函数

    C 43 43 中main函数调用类内函数的方法 以力扣209题为例 include lt iostream gt include lt vector gt using namespace std class minimum size su
  • 堆排序——手工模拟+程序实现

    堆排序的算法思想 xff1a 将待排序列构造成一个大顶堆 xff0c 此时 xff0c 整个序列的最大值就是堆顶元素 输出堆顶元素 xff0c 将堆顶元素与堆底最后一个元素进行交换 xff0c 然后 xff0c 将剩余n 1个元素重新构造成
  • 设计模式详解:原型模式

    本篇来看一下创建型模式中的第四种模式 xff1a 原型模式 仍然是先看两张图 xff0c 复习模式类型 xff0c 加深记忆 定义 xff1a 原型模式 xff1a 使用原型实例指定待创建对象的类型 xff0c 并且 通过复制这个原型来创建
  • maven镜像源及代理配置

    在公司使用网络一般需要设置代理 xff0c 我在idea中创建springboot工程时 xff0c 发现依赖下载不了 xff0c 原以为只要浏览器设置代理 xff0c 其他的网络访问都会走代理 xff0c 经过查资料设置了以下几个地方后工
  • IDEA SpotBugs代码安全审计插件

    IDEA SpotBugs代码安全审计插件 在寻找idea代码审计插件的时候 xff0c 发现Findbugs已经停止更新 xff0c 无法在idea2020 01版本运行 xff0c 由此找到SpotBugs SpotBugs介绍 Spo
  • 洛谷P1233 木棍加工

    题目描述 一堆木头棍子共有n根 xff0c 每根棍子的长度和宽度都是已知的 棍子可以被一台机器一个接一个地加工 机器处理一根棍子之前需要准备时间 准备时间是这样定义的 xff1a 第一根棍子的准备时间为1分钟 xff1b 如果刚处理完长度为
  • 如何用python写一个计算日期间隔的程序?

    如何用python写一个计算日期间隔的程序 xff1f 文章目录 如何用python写一个计算日期间隔的程序 xff1f 前言问题梳理问题解决写在后面 前言 为什么想起来写一个这样的程序呢 xff1f 前几天聊天的时候 xff0c 突然想计
  • Ubuntu 中软件包缓存文件损坏问题

    终端输入 xff1a sudo apt get update 出现如下问题 解决方法 xff1a 输入 sudo rm rf var lib apt lists
  • linux开机自启系统服务的大致原理

    Linux启动系统服务 init启动 init读取 etc inittab文件 xff0c 获取运行等级 span class token comment The default runlevel 启动时的运行等级 span id 5 in

随机推荐

  • apache2 配置https

    配置Apache2 https 开启ssl模块 span class token function sudo span a2enmod ssl 启用ssl站点 span class token function sudo span a2en
  • JAVA对数字+字符串,中文一二三四等特殊格式字符串进行特殊排序

    提示 xff1a 对数字 43 字符串 中文一二三四 格式字符串去重 排序 重组 可以对customSort 类的46 53行进行修改 查看新排序效果 代码如下 xff08 示例 xff09 1 SortTest 类 xff1a span
  • Linux安装Jenkins

    手把手教你在Linux上安装jenkins xff0c 废话不多说 xff0c 直接上教程 1 xff0c 用windows到官网下载jenkins 2 346 1 1 noarch rpm xff0c 下载链接 xff1a https w
  • 舵机控制(STM32F103C8T6)

    前言 本文是以STM32F103C8T6作为主控芯片 xff0c 通过PB6端口输出PWM xff0c 实现控制180 舵机 一 舵机控制原理 xff08 一 xff09 概述 舵机是一种位置伺服驱动器器 xff0c 是一种带有输出轴的小装
  • 设计模式详解:建造者模式

    今天来看一下创建新模式中的第五种模式 xff1a 建造者模式 仍然是先看两张图 xff0c 复习模式类型 xff0c 加深记忆 定义 xff1a 建造者模式 xff1a 将一个复杂对象的构建与它的表示分离 xff0c 使得同样的构建过程可以
  • 动态数码管显示(STM32F103C8T)

    一 前言 本实验是通过使用STM32F103C8T6作为主控 xff0c 八段数码 xff08 共阴极 xff09 是通过74HC245双向缓冲器控制数段选 xff0c 74HC138译码器控制位选 每个数码管显示与位号相对应的数字 xff
  • 取字模软件的使用

    1 点击运行 取字模软件 EXE 2 输入文本 xff0c 完成后按Ctrl 43 Enter按键结束输入 xff0c 如下图 3 设置字体显示的大小16 16 xff0c 如下图 xff1a 4 设置字体格式 xff0c 字体大小 xff
  • 51单片机应用篇-- --数码管60秒计时,独立按键可调

    开篇先说一句废话 本旺名字叫萨摩耶 xff0c xff0c Please 叫我旺财 xff0c xff0c xff0c 哈哈 xff0c 招财进宝嘛 xff01 缘由 本来按照我的学习计划 xff0c 我现在应该是单片机的学习过程 xff0
  • SOLIDWORKS生成URDF文件后部分文件散乱分布

    问题 xff1a SOLIDWORKS生成URDF文件在正确配置关节坐标系的情况下 xff0c 依然出现了部分零件散乱分布的情况 xff0c 例如图所示 xff1a 问题原因 xff1a 同样的零件多次装配 解决办法 xff1a 要插入同一
  • Matlab笔记:Matlab function生成C代码并运行

    1 Matlab函数 xff0c 输入 x y z roll pitch yaw xff0c 输出out为8 6的数组 2 点击Matlab coder 3 选择要生成的函数 4 定义输入类型 xff0c 输入的六个数选择double数值
  • matlab接收ROS发布的话题通信数据并实时画图

    版本说明 matlab R2021b ROS noetic matlab与ROS通信连接 在matlab和ROS连接之前 xff0c 需要先运行ROS核心 xff0c 记录ROS端的IP地址 再查找并记录matlab端 xff08 我这里是
  • simulink联合STM32CubeMX开发串口通信程序

    摘要 使用SIMULINK联合STM32CubeMX生成STM32F407串口发送数据代码 xff0c 发送的数据为正弦函数波形 再用SIMULINK写一个串口接收数据模型 xff0c 接收来自STM32发送的数据 xff0c 最后绘制出波
  • element 默认主题样式

    使用方法 span class token keyword import span ElementUI span class token keyword from span span class token string 39 elemen
  • 深入RUST标准库内核(一)标准库内容概述

    本书github链接 inside rust std library 本书前面章节 xff1a 深入RUST标准库内核 xff08 序言 深入RUST标准库内核 引言概述本书目的目标读者本书约定 RUST标准库体系概述core库编译器内置i
  • 深入RUST标准库内核(序言)

    对RUST的兴趣来自于Linus认真考虑将RUST作为Linux内核开发语言的新闻报道 因此开始了对RUST探索 xff0c 不久后基本上就从心底里认同了这门语言 xff0c RUST不仅是高性能及安全的语言 xff0c 它的语法设计也会带
  • 手记:把代码上传到Gitee等远程仓库的过程记录及常见问题

    很久没用git了 xff0c 指令都有点生疏了 xff0c 今天上传了一些代码到码云上 xff0c 先把过程记录下来供使用git的朋友参考 没有用图形化界面 xff0c 因为只有熟悉指令才能真正的理解领会 步骤一 xff1a 1 安装git
  • I2C总线协议原理

    首先I2C总线一共分为2根 xff0c 一根是SCL xff08 serial clock xff09 xff0c 还有一根是SDA xff08 serial data xff09 xff0c 一根是用来同步时钟的 xff0c 一根是发送接
  • 常用默认端口+URL解析+HTTP详解

    常用默认端口 http端口80 https端口443 tomcat端口8080 URL详解 http www aspxfans com 8080 news index asp boardID 61 5 amp ID 61 24618 amp
  • Vue3.0 setup函数

    setup 1 Vue3 0中一个新的配置项 xff0c 值为一个函数 2 setup是所有Composition API 组合API 表演舞台 3 组件中所用到的 xff1a 数据 方法等等 xff0c 均要配置在setup中 4 set
  • 【青训营】Go的高质量编程

    Go的高质量编程 本文内容总结自字节跳动青年训练营 第五届 后端组 什么是高质量 xff1f 各种边界条件是否完备异常情况能正常处理 xff0c 稳定性有保障易读易维护 Go语言开发者Dave Cheney指出 xff0c 编程需要遵循以下