首页 > 解决方案 > 在 Go 中编写多个带有数字范围的嵌套 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
    }
}

标签: gocoding-style

解决方案


简化外部 if / else if / else 去除冗余比较并转换为 switch:

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
   }

推荐阅读