Go 重构:尽量避免使用 else、break 和 continue

else 操作

我们有简单的用户处理程序:

func handleRequest(user *User) {if user != nil {showUserProfilePage(user)} else {showLoginPage()}
}

如果没有提供用户,则需要将收到的请求重定向到登录页面。If else 似乎是个不错的决定。但我们的主要任务是确保业务逻辑单元在任何输入情况下都能正常工作。因此,让我们使用提前返回来实现这一点。

func handleRequest(user *User) {if user == nil {return showLoginPage()} showUserProfilePage(user)
}

逻辑是一样的,但是下面的做法可读性会更强。

break 操作

对我来说,Break 和 Continue 语句总是可以分解的信号。

例如,我们有一个简单的搜索任务。找到目标并执行一些业务逻辑,或者什么都不做。

func processData(data []int, target int) {for i, value := range data {if value == target {performActionForTarget(data[i])break}}
}

你应该始终记住,使用 break 操作符并不能保证整个数组都会被处理。这对性能有好处,因为我们丢弃了不必要的迭代,但对代码支持和可读性不利。因为我们永远不知道程序会在列表的开头还是结尾停止。

在某些情况下,带有子任务的简单功能可能会破坏这段代码。

func processData(data []int, target int, subtask int) {for i, value := range data {if value == subtask {performActionForSubTarget(data[i])}if value == target {performActionForTarget(data[i])break}}
}

这样我们实际上可以拆出一个 find 的方法:

func processData(data []int, target int, subTarget int) {found := findTarget(data, target)if found > notFound {performActionForTarget(found)}found = findTarget(data, subTarget)if found > notFound {performActionForSubTarget(found)}
}const notFound = -1func findTarget(data []int, target int) int {if len(data) == 0 {return notFound}for _, value := range data {if value == target {return value}}return notFound
}

同样的逻辑,但是拆分成更细粒度的方法,也有精确的返回语句,可以很容易地通过测试来实现

continue 操作

该操作符与 break 类似。为了正确阅读代码,您应该牢记它对操作顺序的具体影响。

func processWords(words []string, substring string) {for _, word := range words {if !strings.Contains(word, substring) {continue}// do some buisness logicperformAction(word)}
}

Continue 使得这种简单的流程变得有点难以理解。

让我们写得更简洁些:

func processWords(words []string, substring string) {for _, word := range words {if strings.Contains(word, substring) {performAction(word)}}
}

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

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

相关文章

基于ElasticSearch+Vue实现简易搜索

基于ElasticSearchVue实现简易搜索 一、模拟数据 产品名称描述价格库存数量品牌名称智能手表智能手表,具有健康跟踪和通知功能。199.991000TechWatch4K智能电视4K分辨率智能电视,提供出色的画质。699.99500VisionTech无线耳机降噪无线耳机,…

若依和芋道

国外卷技术,国内卷业务,做管理业务通常使用开源框架就可以快速满足,若依和芋道都是开源二开工具较为流行的框架,芋道是基于若依的,基本上是开发人员自己写业务开发框架的天花板,两者的前端都是基于vue-element-admin的,使用Gitee上两者的SpringBoot的最轻量化版本进行对…

485modbus转profinet网关连三菱变频器modbus通讯配置案例

本案例介绍了如何通过485modbus转profinet网关连接威纶通与三菱变频器进行modbus通讯。485modbus转profinet网关提供了可靠的连接方式,使用户能够轻松地将不同类型的设备连接到同一网络中。通过使用这种网关,用户可以有效地管理和监控设备,从…

Go目录文件路径操作

目录操作 os.ReadDir() 读取目录 package mainimport ("fmt""os" )func main() {dirs, err : os.ReadDir("./search")if err ! nil {fmt.Println(err)}for _, dir : range dirs {fileinfo, _ : dir.Info()fmt.Println(fileinfo)fmt.Println(&…

VR航天科普主题公园模拟太空舱体验馆vr航天模拟体验设备

VR航天航空体验馆巡展是一项非常受欢迎的展览活动,可以让公众在现场体验到航天飞行的乐趣。 普乐蛙VR展览组织者会设计一个航天航空主题的VR体验馆,并在馆内设置各种航天航空相关的展示内容,如太空舱、火箭发射、星际航行等。 其次&#xff0…

【机器学习合集】泛化与正则化合集 ->(个人学习记录笔记)

文章目录 泛化与正则化1. 泛化(generalization)2. 正则化方法2.1 显式正则化方法显式正则化方法对比提前终止模型的训练多个模型集成Dropout技术 2.2 参数正则化方法2.3 隐式正则化方法方法对比 泛化与正则化 1. 泛化(generalization) 泛化不好可能带来的问题 模型性能不稳定容…

解决Linux下编译TBB动态库出错的问题

在CMakeLists.txt中,原来有一段这样查找和链接的配置代码 find_library(tbblibaray ${tbb_path}) target_link_libraries(backalarm ${tbblibaray})编译后提示错误: /myapp/library/tbb/libtbb.so:对‘__cxa_throw_bad_array_new_lengthCX…

css伪类元素使用技巧 表达input父级聚焦css实现

:focus-within 可以让它自己被聚焦或者它的后代元素被聚焦input 中有required 加星号在这里插入图片描述

学习笔记二十一:Pod容器健康探测

这里写目录标题 为什么要对容器做探测默认的健康检查 k8s 提供了三种来实现容器探测的方法三种探针Pod探针相关的属性: 启动探测startupprobeexec模式tcpsocket模式httpget模式 存活性探测livenessProbeLivenessProbe 探针使用示例通过HTTP方式做健康探测httpGet探测…

k8s day08

metric-server概述: Metrics Server从kubelets收集资源指标,并通过Metrics API将它们暴露在Kubernetes apiserver中,以供HPA(Horizontal Pod Autoscaler)和VPA(Vertical Pod Autoscaler)使用。 Metrics API也可以通过kubectl top访问&…

高压放大器在扫描显微镜中的应用及优势是什么

随着科技的不断进步,扫描显微镜成为了现代显微镜技术的重要组成部分。它能够提供更高的分辨率、更广的视场和更强的功能,用于研究各种微观结构和材料的特性。而高压放大器在扫描显微镜系统中发挥着至关重要的作用。下面安泰电子Aigtek将详细介绍高压放大…

hive针对带有特殊字符非法json数据解析

一、背景 有的时候前端或者后端进行埋点日志,会把json里面的数据再加上双引号,或者特殊字符,在落日志的时候,组装的格式就不是正常的json数据了,我们就需要将带有特殊字符的json数据解析成正常的json数据。 二、正则…

算法题:最大出牌数量

最近遇到的一个算法题,在这里记录一下找到的答案。 完整题目: 手里给一副手牌,数字从0-9,有r(红色),g(绿色),b(蓝色),y(黄色)四种颜色,出牌规则为每次打出的牌必须跟上…

一百九十二、Flume——Flume数据流监控工具Ganglia单机版安装

一、目的 在安装好Flume之后,需要用一个工具可以对Flume数据传输进行实时监控,这就是Ganglia 二、Ganglia介绍 Ganglia 由 gmond、gmetad 和 gweb 三部分组成。 (一)第一部分——gmond gmond(Ganglia Monitoring Da…

阶乘(Python)

一、定义 整数的阶乘(英语:factorial)是所有小于及等于该数的正整数的积,0的阶乘为1。即:n!123...n 二、方法说明 python求整数n阶乘的方法: 1、使用math模块factorial(n)来计算n的阶乘 2、for循环语句…

JAVA毕业设计102—基于Java+Springboot+vue的个人理财管理系统(源码+数据库)

基于JavaSpringbootvue的个人理财管理系统(源码数据库) 一、系统介绍 本系统前后端分离 管理员功能: 登录、注册、添加账单、导出账单、统计分析、个人信息修改、消费对比 二、所用技术 后端技术栈: SpringbootSpringMvcmybatismysql 前端技术栈…

[MoeCTF 2023]——Web方向详细Write up、Re、Misc、Crypto部分Writeup

签到 hello CTFer 将url地址复制然后打开即可 得到flag Web http 听说这个http里还有个什么东西叫饼干,也不知道是不是吃的 踩坑了,这里用连接器。。。 开启题目环境 GET方式请求,然后把各种请求头往里加 GET ?UwUuHeader: …

ConcurrentHashMap底层具体实现知道吗?实现原理是什么

从这三个方面来回答: ConcurrentHashMap 的整体架构 ConcurrentHashMap 的基本功能 ConcurrentHashMap 在性能方面的优化 ConcurrentHashMap 的整体架构 这个是 ConcurrentHashMap 在 JDK1.8 中的存储结构,它是由数组、单向链表、红黑树组成. 当我们初始…

mysql的锁介绍

从共享性上来说,mysql的数据库锁分为: 共享锁(读锁):lock in share mode;一个事务获取了读锁之后,不排斥其他事务读数据,但排斥其他事务增删改。 排它锁(写锁):for update;一个事务获…

【ROS 2 基础-常用工具】-7 Rviz仿真机器人

所有内容请查看:博客学习目录_Howe_xixi的博客-CSDN博客