Go 语言if else 条件语句使用教程(流程控制)

 更新时间:2026年04月23日 14:25:54   作者:jieyucx  
本文介绍了Go语言的ifelse条件语句及其应用场景,包括单分支、双分支和多分支的语法格式和注意事项,还讲解了Go语言中if语句的初始化表达式特性及嵌套ifelse用法,并通过综合实战案例巩固知识点,最后,总结了常见错误及避坑指南

大家好~上一篇博客我们掌握了 Go 语言的运算符与控制台输入输出,能实现简单的计算和交互。本篇我们正式进入流程控制的学习——if else 条件语句,它是程序“做判断、分分支”的核心,也是后续学习循环、函数的基础。

和之前一样,所有知识点都搭配可直接复制运行的代码示例,零基础也能轻松上手,学完就能写出有判断逻辑的 Go 程序,彻底告别“顺序执行”的单一模式!

一、前置准备

继续使用我们的 GoStudy 项目,新建文件夹 ifelse,创建 main\.go 文件,所有测试代码均在此文件中编写运行。

基础代码结构(复制即可):

package main
import "fmt"
func main() {
    // 所有if else测试代码写在这里
}

核心说明:流程控制的作用是“让程序根据条件执行不同的代码”,就像生活中“如果下雨就带伞,否则就不带”,if else 就是实现这种逻辑的关键语法。

二、if else 核心语法(3种常用场景)

Go 语言的 if else 语法简洁、严谨,有明确的语法规范,主要分为「单分支」「双分支」「多分支」三种场景,我们逐一讲解,重点注意语法细节(新手易踩坑)。

1. 单分支:if 语句(满足条件才执行)

最基础的判断:如果某个条件为真,就执行一段代码;条件为假,就跳过这段代码

语法格式(必须严格遵循):

if 条件表达式 {
    // 条件为 true 时,执行的代码
}

关键注意点(必看):

  • 条件表达式的结果必须是 bool 类型(true / false),常用关系运算符(==、\!=、\>、\<)或逻辑运算符(\&\&、\|\|、\!)组合。
  • 关键字 if 后面的左大括号 \{必须和 if 及条件表达式在同一行,否则会编译报错(Go 编译器强制规定)[superscript:3]。
  • 即使大括号内只有一行代码,大括号也不能省略(遵循 Go 代码规范,避免逻辑混乱)[superscript:5]。
  • 条件表达式两侧的括号可以省略,复杂条件时加括号能提升可读性。

示例代码(判断年龄是否成年):

package main
import "fmt"
func main() {
    // 定义年龄变量
    age := 19
    // 单分支判断:如果年龄大于等于18,打印成年
    if age >= 18 {
        fmt.Println("你已成年,具备独立民事行为能力")
    }
    // 条件为假时,跳过上面的代码,执行下面的语句
    fmt.Println("程序执行完毕")
}

运行结果:

你已成年,具备独立民事行为能力
程序执行完毕

补充:如果将 age 改为 17,运行结果只会打印“程序执行完毕”,因为 age \>= 18false,跳过了 if 内部的代码。

2. 双分支:if else 语句(二选一)

场景:如果条件为真,执行一段代码;如果条件为假,执行另一段代码,两个分支必执行一个,互不冲突。

语法格式:

if 条件表达式 {
    // 条件为 true 时,执行的代码
} else {
    // 条件为 false 时,执行的代码
}

关键注意点(必看):

  • 关键字 else 必须紧跟 if 分支的右大括号 \},且在同一行,否则编译报错(Go 语法强制要求)[superscript:7]。
  • else 后面的左大括号 \{,必须和 else 在同一行,不能换行。
  • if 和 else 内部的代码块,只会执行其中一个,不会同时执行。

示例代码(判断成绩是否及格):

package main
import "fmt"
func main() {
    // 定义成绩变量(结合上一篇的输入知识,接收用户输入)
    var score int
    fmt.Print("请输入你的考试成绩:")
    fmt.Scan(&score)
    // 双分支判断:及格与否
    if score >= 60 {
        fmt.Printf("你的成绩是 %d 分,及格啦!🎉\n", score)
    } else {
        fmt.Printf("你的成绩是 %d 分,未及格,需要补考哦~\n", score)
    }
}

运行结果(两种情况):

请输入你的考试成绩:85
你的成绩是 85 分,及格啦!🎉

请输入你的考试成绩:58
你的成绩是 58 分,未及格,需要补考哦~

3. 多分支:if else if else 语句(多选一)

场景:有多个条件需要判断,依次检查每个条件,满足哪个条件就执行对应的代码;所有条件都不满足,执行最后的 else 代码(else 可选)。

适合需要分等级、分场景的判断(如成绩分级、年龄分段)。

语法格式:

if 条件1 {
    // 条件1为 true 时,执行的代码
} else if 条件2 {
    // 条件1为 false、条件2为 true 时,执行的代码
} else if 条件3 {
    // 条件1、2为 false、条件3为 true 时,执行的代码
} else {
    // 所有条件都为 false 时,执行的代码(可选)
}

关键注意点(必看):

  • else if 可以有多个(根据需求添加),但建议不超过3个,否则会影响代码可读性(复杂场景可后续学习 switch 语句)。
  • else if 必须紧跟前一个分支的右大括号\},且在同一行,左大括号 \{ 必须和else if 在同一行[superscript:5]。
  • 多个条件是“互斥”的,只要有一个条件满足,就会执行对应的代码,后续的条件不会再判断。
  • 最后的 else 是可选的,如果所有条件都不满足,且没有 else,程序会跳过整个多分支结构,继续执行后续代码。

示例代码(成绩分级):

package main
import "fmt"
func main() {
    var score int
    fmt.Print("请输入你的成绩:")
    fmt.Scan(&score)
    // 多分支判断成绩等级
    if score >= 90 {
        fmt.Printf("成绩 %d 分,等级:优秀🌟\n", score)
    } else if score >= 80 {
        fmt.Printf("成绩 %d 分,等级:良好👍\n", score)
    } else if score >= 60 {
        fmt.Printf("成绩 %d 分,等级:及格✅\n", score)
    } else {
        fmt.Printf("成绩 %d 分,等级:不及格❌\n", score)
    }
    fmt.Println("成绩分级完成!")
}

运行结果(四种情况):

请输入你的成绩:95
成绩 95 分,等级:优秀🌟
成绩分级完成!

请输入你的成绩:88
成绩 88 分,等级:良好👍
成绩分级完成!

请输入你的成绩:65
成绩 65 分,等级:及格✅
成绩分级完成!

请输入你的成绩:59
成绩 59 分,等级:不及格❌
成绩分级完成!

小贴士:多分支的条件顺序很重要!比如“score >= 60”不能放在“score >= 80”前面,否则 80 分以上的成绩也会被判断为“及格”,因为条件判断会“自上而下”执行,满足第一个条件就会终止后续判断。

三、Go 特色:if 语句的初始化表达式(高频用法)

Go 语言的 if 语句有一个非常实用的特性:可以在 if 条件前添加一个初始化语句,用于定义变量,变量的作用域仅限于整个 if else 结构内部(外部无法访问),能简化代码、避免变量污染。

语法格式:

if 变量初始化; 条件表达式 {
    // 变量可在此处使用
} else if ... {
    // 变量也可在此处使用
} else {
    // 变量也可在此处使用
}

关键说明:

  • 初始化语句和条件表达式之间用 ; 分隔。
  • 初始化的变量,仅在当前 if else 所有分支中有效,出了 if else 结构就无法访问(避免变量冲突)[superscript:6]。
  • 这种写法在 Go 中非常常见,尤其适合结合输入、错误处理等场景。

示例代码(简化输入判断):

package main
import "fmt"
func main() {
    // 简化写法:在if中初始化变量score,同时判断条件
    if score := 85; score >= 90 {
        fmt.Println("优秀")
    } else if score >= 80 {
        fmt.Println("良好")
    } else {
        fmt.Println("及格或不及格")
    }
    // 错误示例:score 仅在上面的if else中有效,此处无法访问
    // fmt.Println(score) // 编译报错:undefined: score
}

补充示例(结合输入):

package main
import "fmt"
func main() {
    // 一次性完成:初始化变量、接收输入、判断条件
    if var age int; fmt.Print("请输入年龄:"); fmt.Scan(&age) {
        if age >= 18 {
            fmt.Println("成年")
        } else {
            fmt.Println("未成年")
        }
    }
}

四、嵌套 if else(进阶用法)

场景:在一个 if 或 else 分支内部,再嵌套另一个完整的 if else 结构,用于处理“多层判断”的场景(如“先判断是否成年,成年后再判断是否有驾照”)。

语法格式(简化):

if 条件1 {
    // 条件1为true,执行此处
    if 条件2 {
        // 条件1和条件2都为true,执行此处
    } else {
        // 条件1为true、条件2为false,执行此处
    }
} else {
    // 条件1为false,执行此处
}

关键注意点(必看):

  • 嵌套层级建议不超过 3 层,否则代码会变得混乱、难以维护(可读性变差)。
  • 嵌套的 if else 也要严格遵循语法规范(大括号位置、条件类型等)。
  • 可以通过缩进区分不同层级的分支(Go 建议缩进 4 个空格或 1 个 Tab),提升可读性。

示例代码(多层判断:是否能开车):

package main
import "fmt"
func main() {
    var age int
    var hasLicense bool // 布尔值:true=有驾照,false=无驾照
    fmt.Print("请输入你的年龄:")
    fmt.Scan(&age)
    fmt.Print("你是否有驾照(true=有,false=无):")
    fmt.Scan(&hasLicense)
    // 第一层判断:是否成年
    if age >= 18 {
        fmt.Println("你已成年,符合开车的年龄要求")
        // 第二层判断:是否有驾照
        if hasLicense {
            fmt.Println("恭喜你,可合法开车!")
        } else {
            fmt.Println("你没有驾照,不可开车,需先考驾照~")
        }
    } else {
        fmt.Println("你未成年,不可开车!")
    }
}

运行结果(三种情况):

// 情况1:成年+有驾照
请输入你的年龄:22
你是否有驾照(true=有,false=无):true
你已成年,符合开车的年龄要求
恭喜你,可合法开车!

// 情况2:成年+无驾照
请输入你的年龄:20
你是否有驾照(true=有,false=无):false
你已成年,符合开车的年龄要求
你没有驾照,不可开车,需先考驾照~

// 情况3:未成年
请输入你的年龄:16
你是否有驾照(true=有,false=无):true
你未成年,不可开车!

五、综合实战案例(结合之前知识点)

结合「控制台输入」「运算符」「if else」,实现一个“学生成绩评级+奖学金判断”的完整程序,巩固本篇所有知识点。

需求:

  • 接收用户输入的语文、数学、英语三科成绩;
  • 计算三科平均分;
  • 根据平均分分级(优秀≥90、良好80-89、及格60-79、不及格<60);
  • 额外判断:优秀且平均分≥95,发放一等奖学金;良好且平均分≥85,发放二等奖学金;其他情况无奖学金。

完整代码:

package main
import "fmt"
func main() {
    // 1. 接收用户输入三科成绩
    var chinese, math, english int
    fmt.Print("请输入语文、数学、英语三科成绩(空格分隔):")
    fmt.Scan(&chinese, &math, &english)
    // 2. 计算平均分(浮点型,避免整数取整误差)
    average := (chinese + math + english) / 3.0
    // 3. 输出成绩信息
    fmt.Printf("语文:%d 分,数学:%d 分,英语:%d 分\n", chinese, math, english)
    fmt.Printf("三科平均分:%.1f 分\n", average)
    // 4. 多分支判断成绩等级
    var level string
    if average >= 90 {
        level = "优秀"
    } else if average >= 80 {
        level = "良好"
    } else if average >= 60 {
        level = "及格"
    } else {
        level = "不及格"
    }
    fmt.Printf("成绩等级:%s\n", level)
    // 5. 嵌套判断奖学金(只有优秀、良好才有机会)
    if average >= 80 {
        if average >= 95 {
            fmt.Println("恭喜你,获得一等奖学金!🏆")
        } else if average >= 85 {
            fmt.Println("恭喜你,获得二等奖学金!🎊")
        } else {
            fmt.Println("无奖学金,继续努力哦~")
        }
    } else {
        fmt.Println("无奖学金,继续努力哦~")
    }
}

运行结果示例:

请输入语文、数学、英语三科成绩(空格分隔):96 98 94
语文:96 分,数学:98 分,英语:94 分
三科平均分:96.0 分
成绩等级:优秀
恭喜你,获得一等奖学金!🏆

六、新手常见错误(避坑指南)

  • 大括号位置错误:if、else、else if 后面的大括号没有和关键字在同一行(如 if 条件后换行写 {),导致编译报错[superscript:7]。
  • 错误示例:
  • if age \>= 18 \{ // 错误:\{ 不能换行 fmt\.Println\(\&\#34;成年\&\#34;\) \}
  • 条件表达式不是 bool 类型:比如写 if age(age 是 int 类型),报错“non-bool age (type int) used as if condition”,必须写 if age \>= 18 这类bool结果的表达式。
  • 多分支条件顺序错误:把范围小的条件放在后面,导致条件无法触发(如先判断 score >=60,再判断 score >=80)。
  • 嵌套层级过多:超过3层嵌套,代码可读性变差,容易出错(可尝试拆分逻辑)。
  • 重复使用 if 代替 else if:比如多个独立的 if 语句,导致多个条件同时执行(需求是多选一时,必须用 else if)。
  • if 初始化变量的作用域错误:试图在 if else 外部访问初始化的变量,导致编译报错(变量仅在 if else 内部有效)。
  • 多余的判断:条件本身是 bool 类型,却多此一举写 if hasLicense == true,直接写 if hasLicense 即可(同理,取反用 if \!hasLicense)。

七、本篇总结

  • 核心作用if else 用于实现“条件判断、分支执行”,让程序更灵活,不再是单一顺序执行。
  • 三种常用结构:单分支(if)、双分支(if else)、多分支(if else if else),根据需求选择。
  • 语法规范:大括号位置、条件类型、else/else if 的衔接,必须严格遵循(否则编译报错)。
  • Go 特色:if 可添加初始化语句,变量作用域仅限于 if else 内部,简化代码。
  • 实战技巧:结合输入、运算符,实现“输入→判断→输出”的完整逻辑;嵌套不超过3层,条件顺序要合理。

本篇的 if else 是流程控制的基础,下一篇我们将学习另一个核心——for 循环语句,学会循环后,就能实现重复执行的逻辑(如猜数字游戏、批量处理数据),继续加油!

到此这篇关于Go 语言if else 条件语句使用教程(流程控制)的文章就介绍到这了,更多相关go if else条件语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go并发数据一致性事务的保障面试应答

    go并发数据一致性事务的保障面试应答

    这篇文章主要为大家介绍了go并发数据一致性事务的保障面试应答,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Go标准库常见错误分析和解决办法

    Go标准库常见错误分析和解决办法

    Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓"工欲善其事,必先利其器",本文将深入剖析Go标准库使用中的常见错误,帮助开发者避开这些坑,写出更加健壮的代码
    2025-04-04
  • Go语言中日期包(time包)的具体使用

    Go语言中日期包(time包)的具体使用

    本文主要介绍了Go语言中日期包的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • RabbitMQ延时消息队列在golang中的使用详解

    RabbitMQ延时消息队列在golang中的使用详解

    延时队列常使用在某些业务场景,使用延时队列可以简化系统的设计和开发、提高系统的可靠性和可用性、提高系统的性能,下面我们就来看看如何在golang中使用RabbitMQ的延时消息队列吧
    2023-11-11
  • Apache IoTDB开发系统之Go原生接口方法

    Apache IoTDB开发系统之Go原生接口方法

    这篇文章主要为大家介绍了 Apache IoTDB开发系统之Go原生接口方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Golang如何将日志以Json格式输出到Kafka

    Golang如何将日志以Json格式输出到Kafka

    这篇文章主要介绍了Golang将日志以Json格式输出到Kafka的方法,这篇文章还会提供一种输出Json格式日志的方法,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • go micro集成链路跟踪的方法和中间件原理解析

    go micro集成链路跟踪的方法和中间件原理解析

    这篇文章主要介绍了go-micro集成链路跟踪的方法和中间件原理,关于Http或者说是Restful服务的链路跟踪,go-micro的httpClient支持CallWrapper,可以用WrapCall来添加链路跟踪的CallWrapper,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-05-05
  • 解决golang中container/list包中的坑

    解决golang中container/list包中的坑

    这篇文章主要介绍了解决golang中container/list包中的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go语言并发编程 sync.Once

    Go语言并发编程 sync.Once

    这篇文章要介绍的是Go语言并发编程 sync.Once,sync.Once用于保证某个动作只被执行一次,可用于单例模式中,下面文章我们来介绍一下它的使用方法,需要的朋友可以参考一下
    2021-10-10
  • Windows系统中搭建Go语言开发环境图文详解

    Windows系统中搭建Go语言开发环境图文详解

    GoLand 是 JetBrains 公司推出的商业 Go 语言集成开发环境(IDE),这篇文章主要介绍了Windows系统中搭建Go语言开发环境详解,需要的朋友可以参考下
    2022-10-10

最新评论