Go实战学习笔记-1.3流程控制

2023-11-02

1. 前言

这里还是再总结一下流程控制,和其它语言相比做了一些优化,比如相比c增加了迭代器类型的for循环,switch针对c中容易出问题的地方做了一些修改,避免出现缺少break时存在的常见问题,此外,和Java类似也存在跳出循环和多层嵌套的方法,C中容易造成使用不当的goto也同样支持,在解决比较麻烦的go错误处理时goto有奇效,但基本上还是不太建议使用。
本次总结的内容主要如下:

在这里插入图片描述

2. if分支

if语句基本和C语言的if类似(由于Go的语法不需要括号以及使用分号换行,所以写起来是更加高效的):

if xxx {
    xxx
} else if {
    xxx
} else if {
    xxx
} else {
    xxx
}

示例:
判断任意年份是否为闰年,需要满足以下条件中的任意一个:
① 该年份能被 4 整除同时不能被 100 整除;
② 该年份能被400整除。

package main

import "fmt"

func main() {
	var a int
	fmt.Println("请输入年份:")
	fmt.Scan(&a)
	if a % 400 == 0 {
		fmt.Println("该年是闰年")
	} else if (a % 4 == 0) && (a % 100 != 0) {
		fmt.Println("该年是闰年")
	} else {
		fmt.Println("该年不是闰年")
	}
}

结果:

在这里插入图片描述

3. for及for-range循环

除了传统的for循环,目前较新的语言都是支持迭代器方式的for循环的,go也不例外,通过range关键词来迭代获取对应的key、value值进行迭代进行循环。
示例:

package main

import "fmt"

func main() {
	var i int
	sum := 0
	for i = 0; i < 100; i++ {
		sum+=i
	}
	fmt.Println(sum)

	arr := [...]int{1,2,3,4,5}
	for k,v := range arr {
		fmt.Println(k, v)
	}
}

结果:

在这里插入图片描述

4. switch-case-fallthrough分支

在C中switch-case之后跳出某个分支是需要break的,新手往往会忘记break从而引起bug,因此在Go中去掉了分支结束需要break跳出的方式,case分支结束后就自动跳出该分支了;对于某些特殊需求比如多个case分支共用一个执行语句或这个分支结束后想继续执行下一个分支,那么使用fallthrough来避免执行后跳出对应的case分支,当然,这种方式是不提倡的。
示例:

package main

import "fmt"

func main() {
	var a int
	fmt.Println("请输入1-7:")
	fmt.Scan(&a)
	switch a {
	case 1:
		fmt.Println("星期一")
	case 2:
		fmt.Println("星期二")
	case 3:
		fmt.Println("星期三")
	case 4:
		fmt.Println("星期四")
	case 5:
		fmt.Println("星期五")
	case 6:
		fmt.Println("星期六")
	case 7:
		fmt.Println("星期天")
	default:
		fmt.Println("未知")
	}

	//fallthrough
	switch a {
	case 1:
		fmt.Println("星期一")
	case 2:
		fmt.Println("星期二")
	case 3:
		fmt.Println("星期三")
	case 4:
		fmt.Println("星期四")
	case 5:
		fmt.Println("星期五")
	case 6:
		fmt.Println("星期六")
		fallthrough
	case 7:
		fmt.Println("周末")
	default:
		fmt.Println("未知")
	}
}

结果:

在这里插入图片描述

5. goto

goto语句我觉得处理错误时比较好用,因为没有抛出异常,很可能会出现很多判断err的情况,这种的可以使用goto统一处理,但是怎么说那,goto语句这种跳转还是会造成一定的风险,基本上还是不太建议使用。
示例:

package main

import "fmt"

func main() {
	var a int
	fmt.Println("请输入1-7:")
	_, err := fmt.Scan(&a)
	if err != nil {
		goto errTodo
	}

	_, err = fmt.Println(a)
	if err != nil {
		goto errTodo
	}

errTodo:
	fmt.Println("错误处理")
}

结果:

在这里插入图片描述

6. break和continue

由于go没有while循环,一般是使用for循环来代替的,要跳出循环或者逻辑判断后直接进行下一次循环的话还是需要breakcontinue
示例:

package main

import "fmt"

func main() {
	for {
		var a int
		fmt.Println("请输入1-7:")
		_, err := fmt.Scan(&a)
		if err != nil {
			fmt.Println(err)
			continue
		}

		if (a < 1) || (a > 7) {
			fmt.Println("非法的输入")
			continue
		}

		if (a >= 1) && (a <= 7) {
			fmt.Println("输入正确:", a)
			break
		}
	}
}

结果:

在这里插入图片描述

7. 跳出嵌套循环

对于嵌套循环,我们有时候需要跳出外层循环,这时go也是借助于类似Java等的命名空间的方式break跳出嵌套循环。
示例:

package main

import "fmt"

func main() {
	first:for i := 0; i < 5; i++ {
		for j := 0; j < 5; j++ {
			fmt.Println(i * j)
			if i * j == 4 {
				break first
			}
		}
	}
}

结果(可以试一下不加first只有break的话会跳出到哪里):

在这里插入图片描述

8. 最后

基本上流程控制就这些了,相较于C,go去除了while循环,for循环完全是足够的,增加了for range这种迭代方式的循环,此外,switch上也去除了容易犯错的必须加break的地方,对于有特殊需求的也增加了fallghrough来处理,嵌套循环跳出的方式和Java等是比较类似的。

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

Go实战学习笔记-1.3流程控制 的相关文章

  • 如何在 Goji (Golang) 中使用不同的中间件创建单独的路由组?

    我正在使用Goji https github com zenazn goji https github com zenazn goji 并希望定义具有自己的中间件的路由组 例如 下面的所有路径 company应使用 LDAP 身份验证并定义
  • 给定方法值,获取接收者对象

    Go 有没有办法从方法值获取接收者对象 例如有没有这样的MagicFunc这将使以下程序输出字符串my info来自底层 Foo 实例 package main import fmt type Foo struct A string fun
  • Go 中的 WebP 编码器/解码器

    是否有一个完整的 WebP 编码器和解码器与当前每周 或可分叉 兼容 它的速度与标准 png 相当吗 这个人在 GitHub 上有一个包 其中包含 WebP 的编码器和解码器 https github com chai2010 webp h
  • 我们如何在 Golang 中组合多个错误字符串?

    我是 golang 新手 我的应用程序需要在循环中返回多个错误 稍后需要组合并作为单个错误字符串返回 我无法使用字符串函数来组合错误消息 在返回之前可以使用什么方法将这些错误合并为一个错误 package main import fmt s
  • 我可以根据我正在构建的操作系统导入 Golang 包吗?

    假设我有一个基于哪个操作系统的 go 项目 在某些情况下是哪个发行版 我想使用 Systemd 客户端包 Upstart 客户端包 sysv 客户端包 launchd 客户端包 是否可以有选择地导入每个包 以便我只导入我正在构建的每个操作系
  • Gorm 总是返回带有 nil 值的结构

    我正在使用 Gorm 构建 Go Web API 作为 Amazon RDS 中 Postgresql 数据库的 ORM 问题是 Gorm 总是返回一片结构 其值全部为零 尽管数据库已经填充了数据 切片中的结构体数量是否合适取决于LIMIT
  • 使用 OpenTelemetry 统一不同服务的范围

    我刚刚开始使用 OpenTelemetry 并为此创建了两个 微 服务 Standard and GeoMap 最终用户将请求发送到Standard服务 该服务又将请求发送到GeoMap在将结果返回给最终用户之前获取信息 我使用 gRPC
  • (转)如何使用toml文件?

    正如标题 我想知道如何使用 golang 中的 toml 文件 在此之前 我展示了我的 toml 示例 这样对吗 datatitle enable true userids 12345 67890 datatitle 12345 prop1
  • 我应该避免在 golang 中使用单例包吗?

    现在我有一个包裹store包含以下内容 package store var db Database func Open url string error open db connection func FindAll model inter
  • 递归追加到切片不起作用

    我正在尝试学习 Go 但我不明白为什么递归调用堆栈末尾的这段代码返回一个空切片 有帮助吗 还tmp甚至似乎没有在调试器中注册 func main input 3 int 4 6 7 expected 6 7 4 6 7 4 6 4 7 fm
  • 在 Go/ 中创建/更新 google 驱动器权限/ [使用 api 创建电子表格但无法访问它]

    我正在尝试使用 google Drive api 和以下代码创建电子表格 但我无法访问它 update 该文件似乎不在我在这里指定的驱动器中 有人知道为什么会发生这种情况吗 update 在字段中添加了父母 但有 404 错误 说找不到文件
  • 为什么Golang无法从前面小写字符的struct生成json?

    我正在尝试打印我创建的结构体的 json 结果 如下所示 type Machine struct m ip string m type string m serial string 并打印出来 m Machine m ip test m t
  • bazel go_embed_data“无法嵌入”

    我将以下 bazel BUILD 配置为 gazelle name gazelle go embed data name static files srcs glob static package main var staticFS go
  • 与 Reflect.StructTag.Get 不兼容

    我当时在 Google Cloud 中工作 一切都很好 但是当我在 PC 中克隆所有项目时 每个 JSON 结构中都有此消息 结构体字段标签bson edad json edad omitempty 与reflect StructTag G
  • 使用 StructScan 将 postgresql 数组获取到结构中

    测试数据 CREATE TABLE test id int data text INSERT INTO test id data VALUES 1 a b c 去代码吧 第一个 一个运行良好的 func main db sqlx Open
  • Golang 有 libfaketime 替代品吗?

    我想自动化一些测试 我必须操纵系统时间来检查用 golang 编写的程序的身份验证行为 根据这个帖子 https stackoverflow com questions 36024872 libfaketime doesnt work wi
  • 交叉编译共享库

    我想知道是否有可能 如果是的话 如何 与 Go 交叉编译共享库 假设我有这段代码 package main import C export DoubleIt func DoubleIt x int int return x 2 func m
  • 解组此 xml 时遇到问题

    尝试了解如何在 Go 中解组 XML 通读多个示例和 stackoverflow 问题 我想要的是一个包含系统上安装的所有补丁的切片 我什至无法解组补丁 没有错误 只是一个空切片 可能做的事情基本上是错误的 提前感谢您的任何建议
  • Golang 使用 gomail.v2 实现多个收件人

    我通过 gomail v2 发送电子邮件的唯一方法是在 for 循环中对每封电子邮件使用 Send 函数 但我需要向其他电子邮件地址显示已发送相同的电子邮件 for recipient range os Args 3 mail SetAdd
  • go语言读取并合并两个Yaml文件

    假设我们有两个 yaml 文件 master yaml someProperty someVaue anotherProperty anotherValue 覆盖 yaml someProperty overriddenVaue 是否可以解

随机推荐

  • MySQL 与 Redis 缓存的同步方案

    MySQL 与 Redis 缓存的同步方案 概述 MySQL 和 Redis 都是常见的数据存储方案 MySQL 用于存储结构化数据 Redis 用于存储非结构化数据 在一些高并发场景下 为了提升系统的性能 我们通常会将数据存储在 Redi
  • ubuntu下nginx1.0.15的安装

    1 首先到官网下载好nginx的原码 http nginx org en download html 2 安装nginx必备软件 gcc g pcre库 安装gcc sudo apt get install gcc 安装g sudo apt
  • VC设置程序热键

    为程序设置热键就是用到一个RegisterHotKey系统API 当然些API的使用相对简单 但也需要注意一些地方 所以在使用API前请参考MSDN相关文档 本文只给出一个设置程序热键的例子代码如下 1 在OnInitDialog中调用Re
  • docker 下载kafka

    Kafka采用的是订阅 发布的模式 消费者主动的去kafka集群拉取消息 与producer相同的是 消费者在拉取消息的时候也是找leader去拉取 kafka存在的意义 去耦合 异步 中间件的消息系统 首先安装zookeeper dock
  • 使用matlab搭建BP从零搭建BP神经网络完成鸢尾花数据集分类

    iris training mat文件如下 链接 https pan baidu com s 14vb1c0noPB4YKCCdOCsofA pwd ozmz 提取码 ozmz 不赘述 正确率96 7 load iris training
  • c++中的虚函数及虚函数表

    引语 我们在学习c 中经常会碰到一些莫名其妙的性质 特性等 如虚基类继承 虚函数等 但如果从底层 内存 编译器的角度去理解 那将会发现是如此合理且必要 c 中 我们来看这一个代码 class A pubilc void fun cout l
  • 优化网站性能 提高网站速度访问速度的14条实践

    相信互联网已经越来越成为人们生活中不可或缺的一部分 ajax flex等等富客户端的应用使得人们越加 幸福 地体验着许多原先只能在C S实现的功能 比如Google机会已经把最基本的office应用都搬到了互联网上 当然便利的同时毫无疑问的
  • ChatGPT的功能,优势,以及在生活中的应用

    ChatGPT是一种基于人工智能技术的聊天机器人 它可以模拟人类的对话方式 与用户进行交互 ChatGPT的功能和优势非常多 下面将详细介绍 ChatGPT的功能 1 自然语言处理 ChatGPT可以理解自然语言 识别用户的意图和需求 从而
  • 关于golang的http库及常用库

    go语言作为一个面向网络 面向服务 高并发的一门通用语言 http库是非常重要的 下面我们来了解http库及其他标准库 http库可以对客户端做很多的工作 下面我们来看一下 func main resp err http Get https
  • xxl-job的使用及简述原理

    文章目录 前言 1 介绍 2 部署篇 2 1 初始化数据库 2 2 部署调度中心 2 2 1 集群部署 2 3 部署执行器 2 3 1 集群部署 3 使用篇 3 1 设置执行器 3 2 新建任务 3 3 启动任务 3 4 查看日志 4 原理
  • layuiadmin(官方)知识点

    动态模板 layuiAdmin 的视图是一个 动静结合 的载体 除了常规的静态模板 你当然还可以在视图中存放动态模板 因此它可谓是焦点中的焦点 定义模板 在视图文件中 通过下述规则定义模板 下面是一个简单的例子 在不对动态模板设定数据接口地
  • Rust gRPC 库 tonic 使用记录

    tonic 使用记录 服务端 cargo run bin server 客户端 cargo run bin client
  • sendfile“零拷贝”、mmap内存映射、DMA

    原创连接 https blog csdn net z69183787 article details 104760890 utm source app groupmessage KAFKA推送消息用到了sendfile 落盘技术用到了mma
  • Java入门基础第7天【Java Eclipse安装教程和修改汉化教程】

    活动地址 CSDN21天学习挑战赛 六款Java常用的开发工具 我们在学习 Java 语言程序设计必须选择一个功能强大 使用简单 能够辅助程序设计的 IDE 集成开发环境 在Java入门基础第6天 我们认识了Java六款常用的开发工具 这篇
  • 网络层(三)

    网络层 网络层基本上就是围绕着路由器展开的 因此我们很有必要学习路由器的工作原理 首先 路由器由三个部分组成 输入端口 交换结构 输出端口 我们一个一个来分析 输入端口 输入端口需要完成的任务 接收分组 确定分组应该转发到哪个输出端口 那输
  • Vue3实现数据子传父

    Vue3实现数据子传父 子组件页面 html 子组件上需要用到的方法
  • android毕业论文致谢,毕业论文致谢10篇(精选)

    毕业论文致谢10篇 精选 最后深深的感谢呵护我成长的父母 每当我遇到困难的时候 父母总是第一个给我鼓励的人 回顾20多年来走过的路 每一个脚印都浸满着他们无私的关爱和谆谆教诲 10年的在外求学之路 寄托着父母对我的殷切期望 他们在精神上和物
  • 浏览器报错:您的连接不是私密连接。 简单的处理方法

    经常会遇到以上这种提示 您的连接不是私密连接 导致无法访问网页 简单的处理方法就是 鼠标焦点在在浏览器窗口 非浏览器输入框 的任意位置输入以下英文字符串 thisisunsafe 输入完毕页面即可自动跳转正常访问
  • Java十进制转三进制

    pre class java 十进制转三进制 只实现了整数部分 author CaoChenMiao public class TentoSan private int TtS int inNum int index throws Exce
  • Go实战学习笔记-1.3流程控制

    1 前言 这里还是再总结一下流程控制 和其它语言相比做了一些优化 比如相比c增加了迭代器类型的for循环 switch针对c中容易出问题的地方做了一些修改 避免出现缺少break时存在的常见问题 此外 和Java类似也存在跳出循环和多层嵌套