首页 > 其他分享 >Go:条件控制语句

Go:条件控制语句

时间:2023-12-06 11:35:11浏览次数:28  
标签:语句 case code 控制 default else switch Go block

在 Go 语言中,主要的条件控制语句有 if-elseswitchselect。以下是对它们的简单介绍:

1. if 语句:

if 语句用于根据条件执行不同的代码块。它的基本形式如下:

if condition {
    // code block
} else if condition2 {
    // code block 2
} else {
    // default code block
}
  • condition 是一个布尔表达式,如果为真,将执行与 if 关联的代码块。
  • 可以有零个或多个 else if 部分,每个 else if 部分都有一个条件,如果前面的条件为假且当前条件为真,则执行相应的代码块。
  • 可以有一个可选的 else 部分,用于处理所有条件均为假的情况。
// 示例
num := 42

if num > 50 {
    fmt.Println("Number is greater than 50")
} else if num < 0 {
    fmt.Println("Number is negative")
} else {
    fmt.Println("Number is between 0 and 50 (inclusive)")
}

2. switch 语句:

switch 语句用于根据一个表达式的值选择不同的执行路径。它的基本形式如下:

switch expression {
case value1:
    // code block 1
case value2:
    // code block 2
default:
    // default code block
}
  • expression 是一个表达式,其值会与各个 case 的值进行比较。
  • 如果 expression 的值与某个 case 的值相匹配,将执行相应的代码块。
  • 可以有多个 case,每个 case 后面跟着一个值。
  • default 是一个可选部分,表示如果没有匹配的 case,则执行 default 后面的代码块。
// 示例
day := "Saturday"

switch day {
case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday":
    fmt.Println("It's a weekday.")
case "Saturday", "Sunday":
    fmt.Println("It's a weekend.")
default:
    fmt.Println("Invalid day.")
}

3. select 语句:

select 语句用于处理通道(channel)操作,它类似于 switch,但专门用于选择执行哪个通道操作。select 语句用于在多个通道操作中进行选择,如果有多个通道操作都可以执行,则随机选择一个执行。

select {
case msg1 := <-ch1:
    // code block 1
    fmt.Println("Received", msg1)
case msg2 := <-ch2:
    // code block 2
    fmt.Println("Received", msg2)
case ch3 <- "Hello":
    // code block 3
    fmt.Println("Sent Hello")
default:
    // default code block
    fmt.Println("No communication")
}

select 语句中,只有一个 case 会被执行,选择规则是随机的。如果没有可执行的 case,则执行 default

4. 对比 if-elseswitch

if-elseswitch 是用于控制流的两个主要语句。它们都用于根据条件执行不同的代码块,但在某些情况下,switch 语句可能更适合一些特定的场景。下面是对比它们的一些方面:

4.1 可读性和简洁性

  • if-else 适用于简单的条件判断,易于理解和编写。当只有少数几个条件时,if-else 可能更直观。

    if condition1 {
        // code block 1
    } else if condition2 {
        // code block 2
    } else {
        // default code block
    }
    
  • switch 适用于多个条件的情况,尤其是当条件是固定的值时。switch 语句可以更加清晰地表达多个相等条件的情况。

    switch value {
    case condition1:
        // code block 1
    case condition2:
        // code block 2
    default:
        // default code block
    }
    

4.2 条件匹配

  • if-else 使用 if 语句可以使用任意的条件表达式,包括比较运算符、逻辑运算符等。

    if x > 0 && x < 10 {
        // code block
    } else {
        // default code block
    }
    
  • switch switch 语句可以用于比较固定值,不仅仅是等于条件,还可以是其他比较操作符。

    switch x {
    case 1:
        // code block 1
    case 2, 3:
        // code block 2
    default:
        // default code block
    }
    

4.3 类型匹配

  • if-else 可以通过类型断言来进行类型匹配。

    if value, ok := x.(int); ok {
        // code block
    } else {
        // default code block
    }
    
  • switch switch 语句可以直接匹配接口值的类型。

    switch x.(type) {
    case int:
        // code block 1
    case string:
        // code block 2
    default:
        // default code block
    }
    

4.4 Fallthrough

  • if-else 不支持 fallthrough

  • switch switch 语句可以使用 fallthrough 来继续执行下一个 case

    switch x {
    case 1:
        // code block 1
        fallthrough
    case 2:
        // code block 2
    default:
        // default code block
    }
    

4.5 比较多个值

  • if-else 需要使用多个 if 语句来比较多个值。

    if x == 1 {
        // code block 1
    } else if x == 2 {
        // code block 2
    } else {
        // default code block
    }
    
  • switch switch 语句可以一次性比较多个值。

    switch x {
    case 1, 2:
        // code block
    default:
        // default code block
    }
    

扩展:fallthrough

fallthrough 是 Go 语言中的一个特殊关键字,用于在 switch 语句中强制执行下一个 case 的代码块,而不进行条件判断。在正常情况下,switch 语句在匹配到一个 case 后会退出整个 switch 语句,但使用 fallthrough 关键字可以改变这一行为。

以下是一个使用 fallthrough 的简单示例:

package main

import "fmt"

func main() {
    switch num := 2; num {
    case 1:
        fmt.Println("This is case 1.")
        fallthrough
    case 2:
        fmt.Println("This is case 2.")
        fallthrough
    case 3:
        fmt.Println("This is case 3.")
    }
}

在这个示例中,fallthrough 关键字被用于在匹配到 case 1case 2 后继续执行 case 3 的代码块,即使 case 2 的条件也匹配。

需要注意的是,fallthrough 会导致下一个 case 的代码块无条件执行,而不进行后续的条件判断。这在某些情况下可能会带来意外的结果,因此在使用 fallthrough 时需要谨慎。一般而言,fallthrough 的使用场景相对较少,通常在需要某种特定的逻辑流程时才会使用。

在实际编程中,大多数情况下,fallthrough 并不是必须的,而是通过 case 条件来控制流程更加清晰和容易理解。


孟斯特

声明:本作品采用署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)进行许可,使用时请注明出处。
Author: mengbin
blog: mengbin
Github: mengbin92
cnblogs: 恋水无意
腾讯云开发者社区:孟斯特


标签:语句,case,code,控制,default,else,switch,Go,block
From: https://www.cnblogs.com/lianshuiwuyi/p/17879126.html

相关文章

  • Misc_XCTF_WriteUp | a_good_idea
    题目分析压缩包开出只汤姆:一番检查后在十六进制文件末尾发现zip压缩包文件头:更改文件后缀名为zip,在压缩包里开出两只汤姆和一个文本文件。txt内容:“trytofindthesecretofpixels”,直译为:“试着找出像素的秘密”。根据这条提示我们打开StegSolve分别查看两张......
  • 解决谷歌浏览器 Google Chrome不能拖拽安装离线插件的办法
    我使用的谷歌浏览器版本是119.0.6045.160(正式版本)(64位)  之前多台电脑都可以通过拖拽安装crx格式的扩展程序,最近公司配好了新的笔记本,但今天下载好crx文件发现拖动之后并不可以安装,并且已经打开了开发者模式,还是会显示禁用的小图标。解决方式首先打开下面地址:chrome://fla......
  • RBAC权限控制 (Role Based Access Control)
    ACL和RBAC对比之前的ACL权限控制是直接给用户分配权限的。而RBAC是这样的:RBAC是先分开角色,然后把角色分给指定的用户通过在用户和权限之间多加一层“角色”来做权限管理给角色分配权限,然后给用户分配角色这样有什么好处呢?  比如说:管理员有a、b、c3个权限,而张三李四......
  • VSCode 自定义 “Go to File”workbench.action.quickOpenNavigateNextInFilePicker
    默认情况下,是使用Ctrl+p也只能向下进行选择,如果用down或者up手则需要离开主键盘区域,非常的不方便。放到vscode配置快捷键的json文件中{"key":"ctrl+n","command":"workbench.action.quickOpenNavigateNext","when":"inFile......
  • RK3568+Codesys+Xenomai实时软PLC运动控制解决方案
    CODESYS软件架构     CODESYS软件分三层架构,可用下图来表示:1、开发层     CODESYSDevelopmentSystem(具有完善的在线编程和离线编程功能)、编译器及其配件组件、可视化界面编程组件等,同时供用户可选的运动控制模块可使其功能更加完整和强大。IEC61131-3编辑器。CODESY......
  • Mongo查询记录
     场景1:根据用户分组,查询相同的用户下,同时包含多个角色 db.getCollection('Sys_RT_Rel_Role_User').aggregate([{$group:{_id:"$USER_CD",//根据什么字段分组 "ROLE_CD":{"$push":"$ROLE_CD"},//根据USER_CD分组,然后把ROLE_CD......
  • 数据链路层-MAC多点访问控制协议
    解决的问题对于一个共享性介质(总线型局域网的总线),各个节点如何协调对它的访问和使用?通过各种途径来控制对共享介质访问的方式,在数据链路层称为多点访问控制协议。多点访问控制协议按照访问方式分为三种类型:信道划分方式、随机方式、轮流方式。信道划分方式频分复用:FDM(Frequ......
  • oracle 常用语句
    查找前十条性能差的sql语句:SELECT*FROM(selectPARSING_USER_ID,EXECUTIONS,SORTS,COMMAND_TYPE,DISK_READS,sql_textFROMv$sqlareaorderBYdisk_readsDESC)whereROWNUM<10; 查看占io较大的正在运行的session:SELECTse.sid,se.serial#,pr.SPID,se.username,se......
  • go设计模式之工厂模式
    Go语言实现设计模式之工厂方法模式原创 汀风 汀风说后端 2023-12-0608:10 发表于北京汀风说后端编程知识普及,让学习与工作变得更简单。18篇原创内容公众号摘要:工厂方法模式是一种创建型设计模式,它将对象的创建延迟到子类中进行,通过定义一个创建对......
  • DjangoORM语法
    ORM语法-配置django中与数据库映射的关系,不需要写原始sql语句,而是定义模型类,操作模型完成对数据库进行增删改查等操作。o指类对象的意思r指数据库表的意思m指映射的意思orm的优点数据库模型定义在一个地方,方便维护orm有现成的工具,很多功能自动完成,比如数据库消除,预处......