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

news2024/9/24 23:30:50

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是后进先出的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/170900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker安装和卸载教程

1、安装前先卸载系统上原有的Docker sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2、安装需要的yum-utils包 需要安装 yum-utils包&#xff08;该包提供了 yum-c…

研一寒假C++复习笔记--程序的内存模型

目录 1--内存分区模型 2--代码区 3--全局区 4--栈区 5--堆区 6--new操作符 1--内存分区模型 执行C程序时&#xff0c;内存可划分为4个区域&#xff0c;不同区域存放的数据&#xff0c;具有不同的生命周期&#xff1b; ① 代码区&#xff1a;存放函数的二进制代码&#x…

nvcc 编译并行程序时报错gcc: error trying to exec ‘cc1plus‘: execvp: 没有那个文件或目录

一、nvcc 编译程序时报错 gcc: error trying to exec cc1plus: execvp: 没有那个文件或目录 cc1plus 是gcc编译工具链中用到的一个程序 报错非常直白&#xff0c;就是说gcc在执行时找不到这个程序 二、问题解决方法 1.确定是否正确安装gcc、g 如果系统中没有正确安装gcc…

elementUI组件下拉框属性的一些配合使用

文章目录1、单选带搜索功能&#xff08;自定义搜索&#xff09;2、下拉多选远程搜索3、下拉多选有默认选项4、下拉多选默认禁用只提供大致思路&#xff0c;大量玩法等你开发【doge】 1、单选带搜索功能&#xff08;自定义搜索&#xff09; 例如&#xff0c;我需要实现一个功能…

关于学习的一些建议

本文的主要讲的内容如图&#x1f447; 文末附有整个Java的学习路线、能力提升和学习建议的思维导图。 快过新年了&#xff01;在过去的一年里&#xff0c;你们收获了什么呢&#xff1f;在未来的一年里&#xff0c;你们有什么新目标吗&#xff1f; 1.定目标 过去的我往往喜欢…

初识 Django

初识 Django参考描述优劣 Django&#xff08;部分&#xff09;优势功能完备&#xff0c;开箱即用开发效率高Admin 管理后台安全ORM可扩展劣势性能模板过渡封装获取长期支持版&#xff08;Long Time Support&#xff0c;LTS&#xff09;PIP官网获取检测MVC 与 MVTMVC 架构MTV 架…

力扣sql基础篇(十一)

力扣sql基础篇(十一) 1 每件商品的最新订单 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 SELECT p.product_name,o1.product_id,o1.order_id,o1.order_date FROM Orders o1 INNER JOIN ( SELECT pro…

Android自定义绘制1-1 Plus

上一个文章是看着扔物线的视频写的。写玩之后&#xff0c;发现他的文章还有很多内容。尴尬。 接着写呗。 自定义绘制知识的4个级别 1.Canvas的drawXXX()系列方法以及Paint类的一些常见方法。 canvas的drawXXX()是自定义绘制的最基本操作。掌握了这些方法&#xff0c;才知道…

JNPF 3.4.5 java+.Net6 旗舰版企业版 简搭-敏捷业务低代码开发平台

JNPF 低代码通常是指APaaS产品&#xff0c;通过为开发者提供可视化的应用开发环境&#xff0c;降低或去除应用开发对原生代码编写的需求量&#xff0c;进而实现便捷构建应用程序的一种解决方案。广义上低代码概念涵盖所有能够完成代码的集成&#xff0c;减少代码开发的应用过程…

在哔站黑马程序员学习Spring—Spring Framework—(二)spring的注解开发学习笔记

一、注解开发spring的强项—>简化开发spring从2.0开始逐步提供了各种各样的注解&#xff0c;到了2.5注解比较完善&#xff0c;到了3.0推出了纯注解开发,使用java类替代配置文件&#xff0c;开启了spring快速开发通道。二、注解开发定义bean不再需要在spring配置文件中定义be…

拷贝实体的工具类---BeanObjectCopyUtils

目录 前言&#xff1a; 第一步&#xff1a;引用的核心类&#xff1a; 第一种&#xff1a;单个实体的拷贝方法 第二种&#xff1a;列表类的实体拷贝方法 第二步&#xff1a;核心方法的介绍&#xff1a; 核心方法一&#xff0c;介绍了实例化的操作&#xff1a; 核心方法二…

CMMI之项目管理类

项目管理类过程域涵盖了与项目的计划、监督和控制相关的项目管理活动。CMMI-DEV 中的七个项目管理类过程域是&#xff1a;• 集成项目管理&#xff08;Integrated Project Management&#xff0c; IPM&#xff09;• 项目监督与控制&#xff08;Project Monitoring and Control…

蓝桥杯:城邦

题目链接 问题描述 答案提交 本题答案是&#xff1a;4046。 运行限制 思路分析 代码&#xff08;Java&#xff09; 问题描述 小蓝国是一个水上王国, 有 2021 个城邦, 依次编号 1 到 2021。在任意两 个城邦之间, 都有一座桥直接连接。 为了庆祝小蓝国的传统节日, 小蓝国政府…

登录授权方案:JSON Web Tokens (JWT)

登录授权方案&#xff1a;JSON Web Tokens (JWT) JWT官方文档&#xff1a;https://jwt.io/introduction 1.简介&#xff1a; JWT 即 json web tokens&#xff0c;通过JSON形式作为Web应用中的令牌&#xff0c;用于在各方之间安全地将信息作为JSON对象传输&#xff0c;在数据传…

【博客598】从netfilter hook执行原理分析iptables为什么自定义链无法主动调用只能从其它链跳转过来

从netfilter hook执行原理分析iptables为什么自定义链无法主动调用只能从其它链跳转过来 1、netfilter hook执行原理 netfilter 框架是 Linux 网络子系统里的一个核心模块&#xff0c;iptables 就是基于 netfilter 框架实现的一个网络包处理工具。 netfilter hook被调用后执行…

2023年“科学探索奖”申报启动及指南

2023年“科学探索奖”资助不超过50位青年科学家&#xff0c;每位获奖人5年内将获得总计300万元奖金。今年的申报时间为2023年1月1日至3月15日。获奖名单拟定于2023年8月揭晓。本文知识人网小编整理该奖项的概要及申报指南&#xff0c;以飨读者。“科学探索奖”是一项由科学家主…

【高并发内存池】第二弹之threadcache 线程缓存

1.为什么线程向threadcache申请内存不需要加锁&#xff1f; 因为没有把cache设置成全局变量&#xff0c;而是使用了TLS(线程局部存储)&#xff0c;作用是当前内存只可当前线程见到&#xff0c;其他线程没有使用权&#xff0c;避免了加锁的操作&#xff0c;保证了线程数据的独立…

基于paddlex图像分类模型训练(一):图像分类数据集切分:文件夹转化为imagenet训练格式

背景 在使用paddlex GUI训练图像分类时&#xff0c;内部自动对导入的分类文件夹进行细分&#xff0c;本文主要介绍其图像分类数据切分源码&#xff0c;或可作为其他项目储备代码&#xff1a;https://github.com/PaddlePaddle/PaddleX/blob/develop/paddlex/tools/dataset_spli…

[Linux]进程概念以及进程状态

&#x1f941;作者&#xff1a; 华丞臧. &#x1f4d5;​​​​专栏&#xff1a;【LINUX】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。 推荐一款刷题网站 &#x1f449; LeetCode刷题网站 文…

vs2019 + qt5.12.11 打包

目录 你以为打包方式 实际要添加步骤 你以为打包方式 先吐槽一番&#xff0c;感觉vsqt打包有点巨坑&#xff0c;还是说我第一次打包其实都是这样子的 首先我们将生成的.exe弄到一个打包文件夹里面 然后嘞 我用qt自带的打包工具windeployqt exe &#xff08;因为我的再C盘下…