【Go语言基础【7】】条件语句

零、概述

语句类型适用场景核心特点
if-else单条件或简单多条件判断逻辑清晰,适合线性条件判断
switch多值匹配或复杂条件组合支持值匹配、范围匹配和表达式匹配,fallthrough 可灵活控制执行流程
嵌套 if层级依赖的条件判断需控制嵌套深度,优先使用提前返回优化代码结构

注意:

  1. 条件表达式类型
    • if 后必须是布尔表达式(如 a > 10),不能是数值(如 if a 不合法)。
    • switch 的表达式可以是任意类型(如 intstringinterface{} 等)。
  2. 代码风格
    • 建议使用 switch 替代多层 if-else,提高可读性。
    • case 语句按优先级从高到低排列,default 放在最后(可选)。
  3. 性能
    • switch 的底层实现为哈希表或跳转表,匹配效率高于链式 if-else

 

一、if 条件语句

1. 单条件模型

通过布尔表达式判断是否执行对应代码块,else 块处理条件为 false 的情况。

if 布尔表达式 {
    // 条件为 true 时执行
} else {
    // 条件为 false 时执行
}
package main

import "fmt"

func main() {
    var a int = 100
    if a < 20 {
        fmt.Printf("a 小于 20\n")
    } else {
        fmt.Printf("a 不小于 20\n") // 输出此行
    }
    // 输出:a 的值为 : 100
    fmt.Printf("a 的值为 : %d\n", a)
}

 

2. 多条件模型(else if)

按顺序判断多个条件,匹配到第一个 true 的条件即执行对应代码块。

if 布尔表达式1 {
    // 条件1为 true 时执行
} else if 布尔表达式2 {
    // 条件2为 true 时执行
} else {
    // 所有条件不满足时执行
}

 

var age int = 18
if age < 18 {
    fmt.Println("nice")
} else if age < 28 {
    fmt.Println("beauty") // 输出此行
} else if age < 38 {
    fmt.Println("sexy")
} else {
    fmt.Println("next")
}

 

3. 条件嵌套与优化

ifelse if 块中嵌套其他条件语句,但需注意嵌套深度不宜过高,否则影响可读性。

package main

import "fmt"

func main() {
    var a, b int = 100, 200
    if a == 100 { // 外层条件
        if b == 200 { // 内层条件
            fmt.Printf("a 的值为 100 , b 的值为 200\n") // 输出此行
        }
    }
    // 输出:a 值为 : 100,b 值为 : 200
    fmt.Printf("a 值为 : %d\n", a)
    fmt.Printf("b 值为 : %d\n", b)
}

优化嵌套(提前返回)
原嵌套代码

var (
    height float32 = 1.9
    age    uint   = 30
    gender string = "male"
    passed bool
)

if height > 1.8 {
    if age > 25 && age <= 35 {
        if gender == "male" {
            passed = true // 条件全部满足时标记通过
        }
    }
}

优化后(提前返回)

if height <= 1.8 {
    return // 不满足身高条件,直接终止
}
if age <= 25 || age > 35 {
    return // 不满足年龄条件,直接终止
}
if gender != "male" {
    return // 不满足性别条件,直接终止
}
passed = true // 所有条件通过

 

二、switch 条件判断

适用于多值匹配场景,比 if-else 更简洁清晰,支持值匹配、范围匹配和表达式匹配。

1. 基本用法

switch 后可跟变量或表达式,case 后跟具体值或逗号分隔的多个值,default 处理未匹配的情况。

switch 表达式 {
case1,2: // 匹配值1或值2
    // 执行逻辑
case3:
    // 执行逻辑
default: // 可选,未匹配任何 case 时执行
    // 执行逻辑
}
const (
    Unknown = iota // 0
    Male           // 1
    Female         // 2
)

func main() {
    gender := 1 // Male
    switch gender {
    case Unknown:
        fmt.Println("未知性别")
    case Male:
        fmt.Println("男性") // 输出此行
    case Female:
        fmt.Println("女性")
    default:
        fmt.Println("无效性别")
    }
}

 

2. fallthrough 穿透执行

默认情况下,case 匹配后自动终止 switch。若需要继续执行下一个 case,使用 fallthrough(注意:会忽略下一个 case 的条件检查)。

var score = 130 

func main() {
	score = 150
	switch {
	case score >= 100: // 匹配条件
		fmt.Println("奖励 100 金币")
		fallthrough // 穿透到下一个 case(不检查条件)
	case score > 150: // 无论条件是否成立,都会执行(因穿透)
		fmt.Println("额外奖励 50 经验值") // 输出此行
		fallthrough                // 继续穿透
	case score >= 200:
		fmt.Println("再奖励 1 个道具") // 积分 150 不满足条件,但因穿透仍执行
	default:
		fmt.Println("无奖励")
	}
}

输出结果

奖励 100 金币
额外奖励 50 经验值
再奖励 1 个道具

 

3. break 终止执行

case 中使用 break 可提前终止 switch,即使存在 fallthrough 也不会继续执行。

示例代码(审批流程)

var approvalStatus int = 2 // 复审阶段

switch approvalStatus {
case 1: // 初审
    fmt.Println("初审通过")
    if 需要终止流程 { // 假设条件为 true
        break // 终止 switch,不会执行 fallthrough
    }
    fallthrough // 若未 break,穿透到 case 2
case 2: // 复审
    fmt.Println("复审通过") // 仅当 approvalStatus=2 或 case 1 未 break 时执行
case 3: // 终审
    fmt.Println("终审通过")
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roman_日积跬步-终至千里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值