首页 > 编程笔记

Go语言if语句详解

Go语言中,条件判断是由 if 语句实现的,根据条件的判断结果(true 或 false)来执行相应的代码块。

if 语句的语法格式如下:
if 判断条件1 {
    执行语句1
}else if 判断条件2 {
    执行语句2
...
...
}else {
   执行语句N
}
简单来说,if 语句判断某个变量是否符合条件,如果符合就执行相应的代码块,如果不符合就执行另一个代码块。

如下图所示,是 if 语句的执行过程。
if 语句的语法格式说明如下:
程序在执行的时候,首先分析“判断条件1”是否为 true,若为 true,则执行“执行语句1”的代码块,否则往下执行,程序继续分析“判断条件2”是否为 true,若为 true,则执行“执行语句2”的代码块,否则继续往下执行,以此类推。如果所有条件判断不成立,程序最后就会执行 else 语句的“执行语句N”代码。

比如使用 if 语句实现简单的体重评测,代码如下:
package main

import "fmt"

func main() {
    var weight int
    fmt.Printf("输入你的体重(kg):")
    fmt.Scan(&weight)
    fmt.Printf("\n")
    if weight < 40 {
         fmt.Printf("体重值为%v,偏轻\n", weight)
    }else if 40 <= weight && weight <= 70{
         fmt.Printf("体重值为%v,正常\n", weight)
    }else {
         fmt.Printf("体重值为%v,偏重\n", weight)
    }
}
上述代码分别运行 3 次,依次输入数值 30、50 和 80,程序会依次输出体重偏轻、体重正常和体重偏重。

判断条件的变量还可以在 if 语句中定义,变量只能在 if 语句中使用,如果在 if 语句之外使用,则视为未定义变量,换句话说,在 if 语句中定义的变量,变量作用域只适用于 if 语句,示例如下:
package main
   
import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
   // 随机数
   rand.Seed(time.Now().Unix())
   // num := rand.Intn(100)从100中随机生成整数
   if num := rand.Intn(100); num < 20 {
        fmt.Printf("随机数为%v\n", num)
   }else if num > 20{
        fmt.Printf("随机数为%v\n", num)
   }
}
在 if 语句中定义变量能节省内存开支,因为变量只作用在 if 语句中,当 if 语句执行完毕后,Go 语言会自动释放变量的内存地址,从而节省计算机的资源开支。

if的多层嵌套

一个if语句还可以嵌套多个if语句,只要在某个条件的代码中嵌套一个或多个if语句就能实现复杂的逻辑判断。

if 嵌套是把 if…else if…else 语句放在另一个 if…else if…else 语句的代码里面,语法格式如下:
if 判断条件1 {
    if 判断条件一 {
         执行语句一
    }else if 判断条件二 {
         执行语句二
    }else {
         执行语句三
    }
}else if 判断条件2 {
    if 判断条件四 {
         执行语句四
    }else if 判断条件五 {
         执行语句五
    }else {
         执行语句六
    }
}else {
    执行语句N
}
如果将体重评测加入年龄限制,在评测体重之前应先判断年龄大小,使体重评测更加准确,实现代码如下:
package main

import "fmt"

func main() {
    var weight, age int
    fmt.Printf("输入你的年龄:")
    fmt.Scan(&age)
    fmt.Printf("\n")
    fmt.Printf("输入你的体重(kg):")
    fmt.Scan(&weight)
    fmt.Printf("\n")
    if age < 10 {
        fmt.Printf("你的年龄为%v\n", age)
        if weight < 15 {
             fmt.Printf("体重值为%v,偏轻\n", weight)
        }else if weight >= 15 && weight < 30 {
             fmt.Printf("体重值为%v,正常\n", weight)
        }else{
             fmt.Printf("体重值为%v,偏重\n", weight)
        }
    }else if 15 <= age && age <= 30{
        fmt.Printf("你的年龄为%v\n", age)
        if weight < 40 {
             fmt.Printf("体重值为%v,偏轻\n", weight)
        }else if weight >= 40 && weight < 60 {
             fmt.Printf("体重值为%v,正常\n", weight)
        }else{
             fmt.Printf("体重值为%v,偏重\n", weight)
        }
    }else {
        fmt.Printf("你的年龄为%v\n", age)
        if weight < 60 {
             fmt.Printf("体重值为%v,偏轻\n", weight)
        }else if weight >= 60 && weight < 80 {
             fmt.Printf("体重值为%v,正常\n", weight)
        }else{
             fmt.Printf("体重值为%v,偏重\n", weight)
        }
    }
}
从上述代码看到,最外层的 if 语句设置了 3 个条件判断,每个条件判断的代码再设置了 3 个条件判断,因此程序的路径数量为 3×3=9,也就说在程序中输入体重和年龄后,程序根据数值大小会出现 9 种不同的输出结果。

在一个程序中,if 语句嵌套得越多,程序的路径数量就越多,不仅会使代码冗余,而且业务逻辑更加臃肿复杂,对测试人员和功能的维护存在一定难度。

推荐阅读