登录
首页 >  Golang >  Go问答

简洁处理多个数字范围的嵌套 if-else 在 Go 中

来源:stackoverflow

时间:2024-03-26 13:21:31 289浏览 收藏

本文讨论了优化嵌套的 if-else 语句以提高代码可读性和简洁性。作者提出了一种使用数据结构来对范围检查进行编码的方法,然后使用 for 循环和 switch 语句来简化外部和内部 if / else 语句。这种方法有助于消除冗余比较,从而产生更简洁、更容易理解的代码。

问题内容

这段代码很有效,但是我读起来感觉不太好。我发现很难将其重构为更易读或更短的内容。将代码分成几个 if-return 在这里似乎没有多大帮助。尖端?谢谢!

if t < 0 {
    r = 0
} else if t >= 0 && t < 7.5 {
    if m >= 0 && m < 0.125 {
        r = 1
    } else {
        r = 2
    }
} else if t >= 7.5 && t < 10 {
    if m >= 0 && m < 0.125 {
        r = 1
    } else {
        r = 4
    }
} else if t >= 10 && t < 20 {
    if m >= 0 && m < 0.125 {
        r = 1
    } else if m >= 0.125 && m < 0.25 {
        r = 3
    } else {
        r = 4
    }
} else if t >= 20 && t < 22.5 {
    if m >= 0 && m < 0.125 {
        r = 7
    } else if m >= 0.125 && m < 0.375 {
        r = 3
    } else {
        r = 4
    }
} else if t >= 22.5 && t < 27.5 {
    if m >= 0 && m < 0.125 {
        r = 7
    } else if m >= 0.125 && m < 0.625 {
        r = 5
    } else {
        r = 6
    }
} else if t >= 27.5 {
    if m >= 0 && m < 0.25 {
        r = 7
    } else if m >= 0.25 && m < 0.625 {
        r = 5
    } else {
        r = 6
    }
}

解决方案


查看这些值,您可以使用一些数据结构对范围检查进行编码:

type rng struct {
   from,to float64
   v int
}

func (r rng) in(val float64) bool { return val>=r.from && val

然后,编写一个 for 循环,遍历 ranges 的每个元素,并检查 tm 以查看是否有匹配项。

简化外部 if / else if / else 删除冗余比较和转换为开关:

switch {
case t < 0:
    r = 0
case t < 7.5:
    if m >= 0 && m < 0.125 {
        r = 1
    } else {
        r = 2
    }
case t < 10:
    if m >= 0 && m < 0.125 {
        r = 1
    } else {
        r = 4
    }
case t < 20:
    if m >= 0 && m < 0.125 {
        r = 1
    } else if m >= 0.125 && m < 0.25 {
        r = 3
    } else {
        r = 4
    }
case t < 22.5:
    if m >= 0 && m < 0.125 {
        r = 7
    } else if m >= 0.125 && m < 0.375 {
        r = 3
    } else {
        r = 4
    }
case t < 27.5:
    if m >= 0 && m < 0.125 {
        r = 7
    } else if m >= 0.125 && m < 0.625 {
        r = 5
    } else {
        r = 6
    }
default:
    if m >= 0 && m < 0.25 {
        r = 7
    } else if m >= 0.25 && m < 0.625 {
        r = 5
    } else {
        r = 6
    }
}

可以对内部语句进行类似的修改。代码:

if m >= 0 && m < 0.125 {
        r = 1
    } else {
        r = 2
    }

变成:

switch {
   case m < 0:
       // r not changed
   case m < 0.125:
       r = 1
   default:
       r = 2
   }

好了,本文到此结束,带大家了解了《简洁处理多个数字范围的嵌套 if-else 在 Go 中》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>