当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-11-01 17:05:27 210观看
导读今天,我想谈谈相当简单的事情。我不会发明什么,但我在生产代码中经常看到这样的事情,所以我不能回避这个话题。我经常要解开多个复杂的 if else 结构。多余的缩进、过多的逻辑只会加深理解。首先,这篇文章的主要目的是让

今天,我想谈谈相当简单的事情。我不会发明什么,但我在生产代码中经常看到这样的事情,所以我不能回避这个话题。Vqy28资讯网——每日最新资讯28at.com

我经常要解开多个复杂的 if else 结构。多余的缩进、过多的逻辑只会加深理解。首先,这篇文章的主要目的是让代码更透明、更易读。不过,在某些情况下还是必须使用这些操作符。Vqy28资讯网——每日最新资讯28at.com

Vqy28资讯网——每日最新资讯28at.com

else 操作

例如,我们有简单的用户处理程序:Vqy28资讯网——每日最新资讯28at.com

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

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

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

逻辑是一样的,但是下面的做法可读性会更强。Vqy28资讯网——每日最新资讯28at.com

break 操作

对我来说,Break 和 Continue 语句总是可以分解的信号。Vqy28资讯网——每日最新资讯28at.com

例如,我们有一个简单的搜索任务。找到目标并执行一些业务逻辑,或者什么都不做。Vqy28资讯网——每日最新资讯28at.com

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

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

在某些情况下,带有子任务的简单功能可能会破坏这段代码。Vqy28资讯网——每日最新资讯28at.com

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 的方法:Vqy28资讯网——每日最新资讯28at.com

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}

同样的逻辑,但是拆分成更细粒度的方法,也有精确的返回语句,可以很容易地通过测试来实现。Vqy28资讯网——每日最新资讯28at.com

continue 操作

该操作符与 break 类似。为了正确阅读代码,您应该牢记它对操作顺序的具体影响。Vqy28资讯网——每日最新资讯28at.com

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

Continue 使得这种简单的流程变得有点难以理解。Vqy28资讯网——每日最新资讯28at.com

让我们写得更简洁些:Vqy28资讯网——每日最新资讯28at.com

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

本文链接:http://www.28at.com/showinfo-26-16385-0.htmlGo 重构:尽量避免使用 else、break 和 continue

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python十大常用库:让你的Python编程更上一层楼

下一篇: Java循环的终止方式

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • MIX Fold3包装盒泄露 新机本月登场

    MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 6月iOS设备好评榜:第一蝉联榜首近一年

    6月iOS设备好评榜:第一蝉联榜首近一年

    作为安兔兔各种榜单里变化最小的那个,2023年6月的iOS好评榜和上个月相比没有任何排名上的变化,仅仅是部分设备好评率的下降,长年累月的用户评价和逐渐退出市场的老款机器让这
  • 0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    0糖0卡0脂 旭日森林仙草乌龙茶优惠:15瓶到手29元

    旭日森林无糖仙草乌龙茶510ml*15瓶平时要卖为79.9元,今日下单领取50元优惠券,到手价为29.9元。产品规格:0糖0卡0脂,添加草本仙草汁,清凉爽口,富含茶多酚,保留
  • K6:面向开发人员的现代负载测试工具

    K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top