Golang基础 流程控制 条件判断

2023-11-16


条件语句一般指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。

01 条件判断 if

Golang 中 if 条件语句通过 if 关键字声明,声明条件可以省略条件表达式的括号,但是条件语句的代码块左大括号 { 必须在条件表达式的末尾,否则会触发编译错误。

// 声明语法
if 条件表达式 {
    /* 在条件表达式为 true 时执行 */
}

// example:
func IfExp() {
    var x int = 10
    // if x > 10  // 编译出错
    // {
    //     fmt.Println("con't print here")
    // }
    if x >= 10 {
        fmt.Println("x 大于等于 10")
    }
}

多条件判断else 关键字和 if 对应在条件表达式为 false 时执行其代码块; else ifif 的延伸,与多个 if 判断不同的是 else if 与其关联的 if 互斥执行,而前者是相互独立执行的。

func IfExp() {
    var x int = 10

    if x != 10 {
        fmt.Println("x 不等于 10")
    } else {
        fmt.Println("x 等于 10")
    }

    y := 20

    if x == 10 {
        fmt.Println("x 等于 10")
    } else if y == 20 {
        fmt.Println("y 等于 20")
    } else {
        fmt.Println("x 不等于 10")
    }

    if x == 10 {
        fmt.Println("x 等于 10")
    }
    if y == 20 {
        fmt.Println("y 等于 20")
    }
}

局部变量作用域:Golang 中可以在 if 条件表达式之前添加执行语句,再根据执行语句的变量值进行判断。这种特殊写法引出了变量作用域的问题,上述执行语句中的变量仅在 if 局部代码块内生效,不影响外部的变量。

在编程中,变量在其实现了变量的功能后,作用范围越小,所造成的问题可能性越小,每一个变量代表一个状态,有状态的地方,状态就会被修改,函数的局部变量只会影响一个函数的执行,但全局变量可能会影响所有代码的执行状态,因此限制变量的作用范围对代码的稳定性有很大的帮助。

func IfExp() {
    var x int = 10
    if x := subFunc(); x == 1 {
        fmt.Println("x 等于 1")
        x -= 1
        fmt.Println("inner x:", x)
    } else {
        fmt.Println("x 等于 10")
    }
    fmt.Println("global x:", x)
}

func subFunc() int {
    return 1
}

/* output:
x 等于 1
inner x: 0
global x: 10
*/

02 分支选择 switch

switch 分支选择可以理解为一种批量的 if 语句,根据不同的条件执行不同的代码块,使用switch语句可方便地对大量的值进行判断。

区别于 C/C++ 中 switch 语句只能进行常量判断,Golang 中 switch 的分支表达式可以是任意类型,且在每个唯一的 case 分支代码块相互独立,可以省略 break 跳出操作,默认自动终止。

func SwitchExp() {
    var num int = 1
    switch num {
    case 0:
        fmt.Println("case 0")
    case 1:
        fmt.Println("case 1")
    case 2:
        fmt.Println("case 2")
    }
}

同分支合并:如果多个不同 case 的代码执行任务一致,可以将它们放在一起,不同的case表达式使用逗号分隔。

func SwitchExp() {
    str := "hello"
    switch str {
    case "hello", "world":
        fmt.Println("Hello,World!")
    case "你好", "世界":
        fmt.Println("你好,世界!")
    }
}

分支表达式:switch 的 case 中不仅可以是值类型的常量判断,还可以是表达式等任意类型。这种方式类似于 else if 机制,一旦一个 case 表达式满足,后续 case 不再被判断而跳出整个 switch;但是可以使用 fallthrough 关键字强制执行后面的 case 代码块

func SwitchExp() {
    n := 10
    switch {
    case n > 9 && n < 20:
        fmt.Println("9 < n < 20")
        fallthrough
    case n == 10:
        fmt.Println("n == 10")
    }
}

用于类型判断:switch 分支选择常被用来判断 Golang 中表示任意类型或空接口的 any/interface{} 变量中实际存储的变量类型。

func SwitchExp() {
    var a interface{}
    dataType(a)
    var i int = 1
    dataType(i)
    var s string = "hello"
    dataType(s)
}

func dataType(a any) {
    switch t := a.(type) {
    case nil:
        fmt.Printf("变量的类型 :%T\r\n", t)
    case int:
        fmt.Println("变量是 int 型")
    case float64:
        fmt.Println("变量是 float64 型")
    case func(int) float64:
        fmt.Println("变量是 func(int) 型")
    case bool, string:
        fmt.Println("变量是 bool 或 string 型")
    default:
        fmt.Println("未知型")
    }
}

/* output:
变量的类型 :<nil>
变量是 int 型
变量是 bool 或 string 型
*/

03 异步处理 select

待并发编程更新…

参考资料

条件语句if · Go语言中文文档

条件语句switch · Go语言中文文档

Go语言 if判断和for循环实战 goto使用的那些坑 - 掘金


如果文章对你有帮助,欢迎一键三连

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Golang基础 流程控制 条件判断 的相关文章

  • Go内存管理及性能观测工具

    内存管理 TCMalloc Golang内存分配算法主要源自Google的TCMalloc算法 TCMalloc将内存分成三层最外层Thread Cache 中间层Central Cache 最里层Page Heap Thread Cach
  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • Go项目部署及所遇问题

    小聊 本次小白给大家带来Golang项目部署操作以及个人所遇问题和解决它们的方法 依然是一边实操演示一边写文稿 如遇相似问题却存有疑惑可留言 开发环境是Window 部署环境是Linux 开发工具为GoLand 部署服务器为阿里云 1 打包
  • go语言基础-----03-----流程控制、函数、值传递、引用传递、defer函数

    1 流程控制 这里只讲 for range 语句 这个关键字 主要用于遍历 用来遍历数组 slice map chan 例如 package main import fmt func main str hello world 中国 for
  • 【golang】error parsing regexp: invalid or unsupported Perl syntax (正则表达式校验密码)

    要在 Go 中编写密码校验规则 确保密码不少于8位且包含数字和字母 你可以使用正则表达式和 Go 的 regexp 包来实现 以下是一个示例代码 错误示范 package main import fmt regexp func valida
  • Golang协程与通道整理

    协程goroutine 不由OS调度 而是用户层自行释放CPU 从而在执行体之间切换 Go在底层进行协助实现 涉及系统调用的地方由Go标准库协助释放CPU 总之 不通过OS进行切换 自行切换 系统运行开支大大降低 通道channel 并发编
  • Go语言包管理(一)

    Go语言中的包 我们在使用其他语言 比如Java Python 都有类似包的概念 Go也不例外 其核心思想即为分组和模块化 人的大脑对庞大和复杂的事情很难掌控 可以对其采用分而治之的策略 使其模块化 从而更容易管理 如下是标准库中net包的
  • Go_接口、多态、接口继承、空接口、类型断言

    接口 接口是把所有具有共性的方法定义在一起 是方法集 任何类型实现了接口中所有的方法 就是实现了这个接口 接口可以实现多态 接口传递的是地址值 接口定义及调用 定义格式 tepe 接口名 interface 方法名 参数 返回值 调用格式1
  • Golang 内存对齐视频

    https www bilibili com video BV1Ja4y1i7AF 简而言之 就是注意写代码的时候要把相同类型的元素放在一起 更进一步需要自己将结构体配对为32位或64位的整数倍 有助于减少额外空间消耗
  • Go 语言注释教程

    注释是在执行时被忽略的文本 注释可用于解释代码 使其更易读 注释还可用于在测试替代代码时防止代码执行 Go支持单行或多行注释 Go单行注释 单行注释以两个正斜杠 开头 在 和行尾之间的任何文本都将被编译器忽略 不会被执行 示例 This i
  • Go 程序编译过程(基于 Go1.21)

    版本说明 Go 1 21 官方文档 Go 语言官方文档详细阐述了 Go 语言编译器的具体执行过程 Go1 21 版本可以看这个 https github com golang go tree release branch go1 21 sr
  • 【go语言开发】loglus日志框架的使用

    本文将简单介绍loglus框架的基本使用 并给出demo 文章目录 前言 Loglus常见用法 自定义日志级别 使用字段钩子 输出到多个位置 使用钩子实现自定义日志处理 demo
  • go-zero开发入门-API网关开发示例

    开发一个 API 网关 代理 https blog csdn net Aquester article details 134856271 中的 RPC 服务 网关完整源代码 file main go package main import
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • go-zero 的 etcd 配置

    实现代码在 core discov config go 文件中 type EtcdConf struct Hosts string Key string ID int64 json optional User string json opt
  • GoLong的学习之路,进阶,微服务之序列化协议,Protocol Buffers V3

    这章是接上一章 使用 RPC包 序列化中没有详细去讲 因为这一块需要看的和学习的地方很多 并且这一块是RPC中可以说是最重要的一块 也是性能的重要影响因子 今天这篇主要会讲其使用方式 文章目录 Protocol Buffers V3 背景以
  • go开发--操作mysql数据库

    在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动 Go 中常用的 MySQL 驱动有 github com go sql driver mysql 和 github com go xorm xorm
  • [每周一更]-(第55期):Go的interface

    参考地址 https juejin cn post 6978322067775029261 https gobyexample com interfaces https go dev tour methods 9 介绍下Go的interfa
  • go-carbon v2.3.4 发布,轻量级、语义化、对开发者友好的 Golang 时间处理库

    carbon 是一个轻量级 语义化 对开发者友好的 golang 时间处理库 支持链式调用 目前已被 awesome go 收录 如果您觉得不错 请给个 star 吧 github com golang module carbon gite
  • Go、Docker、云原生学习笔记全攻略:从零开始,一步步走向精通!(2024版)

    第一章 Go语言学习宝典 一 介绍 01 Go 语言的前生今世 二 开发环境搭建 01 Go 语言开发环境搭建 三 初识GO语言 01 Go 多版本管理工具 02 第一个 Go 程序 hello world 与 main 函数 03 Go

随机推荐

  • pytorch打印模型梯度

    简介 有时候在调试模型训练过程时 我们需要打印模型中参数的梯度 去查看是否存在梯度消失或者梯度爆炸的问题 可以通过在backward之后查看params的grad属性来确认 参考代码如下所示 import torch 定义模型 class
  • Python3 面向对象编程

    好记性不如烂笔头 对之前阅读书籍进行梳理与总结 此文为 Python3面向对象编程 阅读笔记 文章目录 第一章 面向对象设计 第二章 Python对象 第三章 对象相似时 第四章 异常捕获 第五章 何时使用面向对象编程 第六章 Python
  • C# 导出 Excel 方法

    第一种 使用 Microsoft Office Interop Excel dll public void ExportExcel DataTable dt if dt null Microsoft Office Interop Excel
  • 关键词生成器在线-在线免费关键词生成器

    关键词生成 什么是关键词生成 关键词生成就是根据你输入的一个关键词生成成千上百的核心关键词 围绕着你输入的核心词来生成的 优先生成大量用户搜索的关键词 今天就给大家分享一款免费关键词生成工具 关键词生成的来源主要是用户都在搜索的词 相关搜索
  • CentOS-8-x86_64-1905安装

    CentOS 8 x86 64 1905安装 安装前准备 VMware Workstation 点击下载虚拟机软件 VMware Workstation是一款功能强大的桌面虚拟计算机软件 提供用户可在单一的桌面上同时运行不同的操作系统 和进
  • Crazy Thairs【树状数组+高精度+DP思想】

    题目链接 POJ 3378 题意 有N个点 问的是要求组成一个长度为5的上升子序列的组成有多少种 最搞事情的是这道题不用取模 所以 是一定会爆long long的 首先 很容易想到一点就是我们可以开一个dp maxN 5 表示的是 dp i
  • Vagrant学习笔记:搭建K8s集群

    通常情况下 我们在使用VMware VirtualBox这一类虚拟机软件创建虚拟开发环境时 往往需要经历寻找并下载操作系统的安装镜像文件 然后根据该镜像文件启动的安装向导一步一步地安装与配置操作系统 最后还需要从零开始安装开发与运维工具 整
  • 计算机考研复试机试怎么速成,西安电子大学计算机考研复试机试(2019)+ 学长讲解(6)+ 作业...

    学长讲的就是算法笔记的入门算法 作业1 链接 https www nowcoder com questionTerminal 0f64518fea254c0187ccf0ea05019672 来源 牛客网 有一个网络日志 记录了网络中计算任
  • Java各种集合判空总结

    目录 集合判空 CollectionUtils isEmpty推荐 原始判断 isEmpty 其他 数组判空 集合判空 CollectionUtils isEmpty推荐 这个使用到了spring的工具类 需要提前引入依赖 import o
  • 机器学习2018-12-28

    机器学习 组成 主要任务 分类 classification 将实例数据划分到合适的类别中 应用实例 判断网站是否被黑客入侵 二分类 手写数字的自动识别 多分类 回归 regression 主要用于预测数值型数据 应用实例 股价价格波动的预
  • 用编程器免拆夹子刷斐讯K2 K2P解决难搞固件 刷BREED 无损原EEPROM

    文章中放的几个地址都是思路来源 感谢各路大神原帖子的思路 因为我刷机时候没有拍照 只好借用各位大佬的图来说明步骤 我做一下整理会放出本篇刷机流程 很简单 K2 22 6 532 231软件版本已经无解 UBOOT等可以软刷的方式都被堵死 编
  • .NET编程——利用C#实现TCP协议的异步通信Socket套接字(WinForm)

    本文将介绍利用基于TCP通信协议的Socket实现服务器与客户端之间的数据传输 目录 前言 计算机通信 创建服务器 服务器通信 创建客户端 客户端通信 前言 TCP IP Transmission Control Protocol Inte
  • 【编码-校验码】奇偶校验码

    https zhuanlan zhihu com p 26509678 引自原文 1 定义 奇偶校验位 英语 Parity bit 或校验比特 check bit 是一个表示给定位数的二进制数中1的个数是奇数还是偶数的二进制数 奇偶校验位是
  • 炫酷的Android智能下拉刷新框架,值得一看

    1 Android智能下拉刷新框架 SmartRefreshLayout 支持所有的 View AbsListView RecyclerView WebView View 和多层嵌套的视图结构 支持自定义并且已经集成了很多炫酷的 Heade
  • BRDF详解

    光照模型主要分为三类 测量模型 经验模型和基于物理的分析模型 在计算机图形学中介绍的光照模型为经验模型中的Phong模型 也就是本人理解的 根据点距光源的位置 入射角度等信息计算的 反射强度 包括漫反射强度 镜面反射强度 但是Phong模型
  • 《effective c++》笔记

    序 1 object 在 object oriented技术中的真正意义是 物件 物体 而非 对象 目标 导读 1 术语 1 声明式 告诉编译器名称和类型 但略去细节 std size t numDigit int number std命名
  • 软工导论知识框架(六)面向对象分析

    前言 绘制各种类型的图是重点 对于面向对象建模中需要绘制的图总结在第五期中 软工导论知识框架 五 面向对象方法学 一 分析过程 1 获取需求 与用户交谈 向用户提问题 参观用户的工作流程 观察用户的操作 向用户群体发调查问卷 与同行 专家交
  • 【满分】【华为OD机试真题2023 JAVA&JS】查找重复代码

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 查找重复代码 时间限制 1s 空间限制 32MB 限定语言 不限 题目描述 小明负责维护项目下的代码 需要查找出重复代码 用以支撑后续的代码优化 请你帮助小明找出重复的代码 重复
  • 使用IntelliJ IDEA查看类的继承关系图形

    最近正好也没什么可忙的 就回过头来鼓捣过去的知识点 到Servlet部分时 以前学习的时候硬是把从上到下的继承关系和接口实现记得乱七八糟 这次利用了IDEA的diagram 结果一目了然 也是好用到炸裂 就此分享 1 查看图形形式的继承链
  • Golang基础 流程控制 条件判断

    条件判断 01 条件判断 if 02 分支选择 switch 03 异步处理 select 参考资料 条件语句一般指定一个或多个条件 并通过测试条件是否为 true 来决定是否执行指定语句 并在条件为 false 的情况在执行另外的语句 0