Go Web编程实战(2)----流程控制语句

2023-11-09

流程控制语句

每个语言都会介绍到流程控制语句,Go语言同样具有这些。比如分支结构if-else、for循环、for-range循环、switch-case语句、goto语句、break语句以及continue语句。下面,博主来分别举例介绍使用方式。

if-else语句

基本来说,Go语言的if-else语句与Java语言基本一样。比如,我们这里根据值的大小,选择输出,代码如下所示:

func main() {
	var b int=9
	if b>9{
		fmt.Println("大于")
	}else if(b==9){
		fmt.Println("等于")
	}else{
		fmt.Println("小于")
	}
}

for循环语句

与其他语言不同,Go语言只有for循环,没有while和do-while循环。而且其使用方法与C语言非常接近。下面,我们循环输出1-100个数,代码如下所示:

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

用for循环实现do-while

当然,如果想使用其他语言的do-while语句,我们可以将for循环写成这样:

var i int=0
for{
	i++
	if i>50{
		break
	}
}

用for循环实现while

同样的,我们也可以将for循环实现while循环的效果,代码如下所示:

i :=0
for i<=10{
	fmt.Println(i)
	i++
}

break指定跳出循环

学过C语言的,应该也知道Go语言可以直接goto跳到指定代码。而for循环里面,我们也可以通过break语句直接决定终止哪个循环。比如:

var i,j int
JumpLoop1:
	for i=1;i<100;i++{
		JumpLoop2:
			for j=0;j<i;j++{
				fmt.Println(j)
				if i>10{
					break JumpLoop1
				}else{
					break JumpLoop2
				}
			}
	}

感兴趣的可以删除else分别测试一下,看看最终效果。不过一般来说,如果不指定JumpLoop1,默认最内部的break只会跳出最内部的for循环。

continue语句

和其他语言一样,我们有时候也只需要跳出本次循环,所以Go语言同样给我们提供了continue语句。当然,continue语句后面同样可以跟标签,比如不跳出最内层的本次循环,而跳出最外层的本次循环,可以这样写:

var i, j int
JumpTag:
	for i = 1; i < 100; i++ {
		for j = 0; j < i; j++ {
			fmt.Println(j)
			if i > 10 {
				continue JumpTag
			}
		}
	}

本段代码执行,到i=10,j=9之后,只会输出0。因为i>10时,循环都在j=0输出一次之后,跳出了最外层的循环,故不会有其他值。

for-range循环

在其他编程语言中,我们通常会对map进行迭代。同样的,Go语言给我们提供了for-range循环,它也是一种迭代结构。其语法如下:

for key,value :=range 复合变量值{
	//....逻辑语句
}

遍历数组

首先,我们需要了解数组的定义,与普通变量定义一样,只是多了一个"[]"号。

//无初始值定义
var num []int
//有初始值定义
var num =[]int{1,2,3,4,5,6,7,8,9,0}

下面,我们来展示如何遍历上面的数组。代码如下所示:

//声明数组情况下的遍历
var num =[]int{1,2,3,4,5,6,7,8,9,2}
for key,value :=range num{
	fmt.Println("key=",key,"value=",value)
}
//直接遍历临时创建的数组
for key,value :=range []int{1,2,3,4,5,6,7,8,9,2}{
	fmt.Println("key=",key,"value=",value)
}

遍历字符串

与某些语言一样,Go语言的字符串其实也是单个字符组成的数组,我们同样可以在程序中,对Go字符串进行遍历。代码如下:

var name string="liyuanjinglyj"
for key,value :=range name{
	fmt.Printf("key=%d , value=%c \n",key,value)
}

遍历map

对于map就更简单了,在遍历的时候,key,value正好对应其键值对。具体遍历方式如下所示:

//获取key,value
m:=map[string] string{
	"name":"liyuanjing",
	"age":"29",
}
for key,value :=range m{
	fmt.Printf("key=%s , value=%s \n",key,value)
}
//只获取value
m:=map[string] string{
	"name":"liyuanjing",
	"age":"29",
}
for _,value :=range m{
	fmt.Println(value)
}

第二种方式中的key变更为了"_",这个下划线就是匿名变量,可以理解为占位符。匿名变量本身不参与空间分配,也不会占用一个变量的名字。同样的,也可以对value使用匿名变量,只获取key。

遍历通道(channel)

什么是通道,我们后面介绍,这里我们直接来定义一个通道,看看如何进行遍历。

a := make(chan int)
go func() {
	a <- 1
	a <- 2
	a <- 3
	close(a)
}()
for v := range a {
	fmt.Println(v)
}

上面代码的逻辑:

  1. 创建一个整型类型的通道并实例化
  2. 通过关键字go启动一个goroutine
  3. 将数字传入通道,实现的功能是往通道中推送数据123
  4. 结束并关闭通道
  5. 用for-range循环对通道a进行遍历,即不断地从通道中接受数据直到通道被关闭

switch-case语句

Go语言改进了C语言的switch-case语句,表达式不必为常量,甚至不必为整数。而且case与case之间是独立的代码段,不需要通过break语句跳出当前case,以避免执行到下一个case。

var name ="周杰伦"
switch name {
case "周杰伦":
	fmt.Println("歌手")
case "王昭君":
	fmt.Println("和亲使者")
default:
	fmt.Println("查无此人")
}

上面代码运行结果只会打印歌手,没有break也不会执行下面的语句,这一点博主觉得Go语言设计的不错。

一个分支多个值

当然,其实switch-case语句中的case,并不仅仅只能选择一个词,比如有的明星,即使演员又是歌手,难道用if and进行判断?

var name ="歌手"
switch name {
case "歌手","演员":
	fmt.Println("易烊千玺")
case "作家":
	fmt.Println("盐野七生")
default:
	fmt.Println("啥也不是")
}

分支表达式

case语句不仅仅可以跟常量,也可以和if一样添加表达式。示例如下:

var num =22
switch{
case num>0 && num==22 :
	fmt.Println("是22没错")
default:
	fmt.Println("啥也不是")
}

如上面代码所示,switch在这种情况下,不必再需要加用于判断的变量。

goto语句

Go语言最知名的语句,就是goto语句。通过goto语句可以直接跳转到指定的标签,进行代码之间的无条件跳转。另外,goto语句也可以用作跳出循环,避免重复退出等场景。

在前文中,我们通过break直接跳出到最外层的循环,现在我们改变当时的代码,使用goto来实现结束循环。

func main() {
var i, j int
for i = 1; i < 100; i++ {
	for j = 0; j < i; j++ {
		fmt.Println(j)
		if i > 10 {
			goto endTag
		}
	}
}
return
endTag:
	fmt.Println("循环结束")
}

如上面代码所示,我们直接指定跳转到endTag标签处,这种标签也是自己自定义命名的。

不过需要注意的是,endTag标签上面有一个return,这是因为不满足条件则不执行endTag标签语句,不然,哪怕结束,程序也会顺序执行。

goto这么方便,读者想到了哪些应用场景呢?

相信读者都在其他语言中,抛出过各式各样的异常,特别是很多网络请求其实异常差不多,但遇到一个抛一个是不是非常烦?

而goto就很简单了,可直接跳到指定异常,这样用一个异常就可以解决所有相同异常。

err :=getEmail()
if err !=nil{
	goto endTag
}
err =getUser()
if err !=nil{
	goto endTag
}
endTag:
	fmt.Println(err)
//异常处理

这里,我们假设有2个方法,获取用户名与邮箱,但其实他们抛出的异常都相同,那么可以直接都跳转到指定的标签处,进行相同异常的处理。而不必每个都抛出异常写一遍。

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

Go Web编程实战(2)----流程控制语句 的相关文章

随机推荐

  • Python3学习实战——用类实现简单的猜拳游戏

    Python3学习实战 用类实现简单的猜拳游戏 前言 本笔记仅个人认知和见解 水平有限 还请见谅 如有错误 还请指出 若有想法 欢迎共享 内容不代表最优解决方案 甚至可能不是很好的方法 仅供参考 文章目录 Python3学习实战 用类实现简
  • Ubuntu 20.04 LTS系统下安装STM32CubeProgrammer

    前言 软件环境 一 软件下载 STM32CubeProg STM32CubeProgrammer software for all STM32 STMicroelectronics 二 iso格式转换 制作软件 https etcher b
  • 用Xshell连接服务器失败:Could not connect to ‘192.xx.xx.xx‘ (port 22): Connection failed.

    问题描述 本来一直都连接正常 突然有一天连不上了 脸直接吓白了 本来就好多bug 现在直接服务器都连不上了 成年人的崩溃就在一瞬间 doge 解决方法 提示 仅适用于之前连接正常 突然连不上的情况 如果是这种情况的尽量不要按照网上的教程乱改
  • bat日期时间字符串的格式化处理

    bat日期时间字符串的格式化处理 一 时间 日期 二 字符串处理 一 时间 日期 Windows在批处理中显示的时间和日期格式如下 echo date 2023 05 25 周四 echo time 12 44 27 45 二 字符串处理
  • 【算法】 丑数 2,3,5。求第n个丑数

    因子中仅仅包含2 3 5的数 称为丑数 比如说14 就不是丑数 因为因子包含7 请输出所有丑数中的第n个丑数 include
  • ADNI数据集-数据分析11.17

    1 RID 是 Relative IDentifier 的英文缩写 相对标识符的意思 https www aoetc com 172960 html 2 ADNI1和ADNI2是医学研究上经常使用的数据集 ADNI数据集介绍 仅用于个人纪录
  • 应用在k8s上运行的几种网络模式

    k8s deployment service默认配置 应用部署在k8s上 首先想到的是应用k8s的默认service模式配置 应用通过service向集群内部 ClusterIP 和集群外部 NodePort 暴露服务 k8s中的其他应用通
  • linux系统一些网络配置文件

    etc hosts文件 etc hosts文件的作用是主机名映射到相应的主机IP地址 可以使用任意文本编辑器编辑 etc hosts 文件 如果系统中不存在 etc hosts 文件 请将 usr newconfig etc hosts 复
  • Elasticsearch 8.0 installation

    after creating an enrollment token on your existing cluster You can complete the following actions at any time Reset the
  • js&ts 常用工具函数

    JavaScript TypeScript 常用工具函数 Utils RGB转换 export const rgbToHex r number g number b number gt string r g b gt 1 lt lt 24
  • Windows Server服务器安全加固基线配置

    一 账户管理 认证授权 一 账户 1 管理缺省账户 安全基线项说明 对于管理员账号 要求更改缺省账户名称 禁用Guest 来宾 账户 操作步骤 进入控制面板 gt 管理工具 gt 计算机管理 在系统工具 gt 本地用户和组 缺省账户Admi
  • Spring Cloud简介,为什么需要Spring Cloud?

    一 为什么需要Spring Cloud 从分布式 微服务的角度而言 就是把我们一个大的项目分解成多个小的模块 这些小的模块组合起来 完成功能 而拆分出多个模块以后 就会出现各种各样的问题 而Spring Cloud提供了一整套的解决方案 S
  • 总结:eclipse编写struts.xml没有提示的问题

    原因 找不到约束文件 解决 联网 手工配 手工配置struts2的dtd约束文件 步骤说明 1 选择 Window gt preferences gt XML gt 点击Add 按钮 2 Location值 通过File System 选择
  • python 财务系统开源系统_10 大顶级开源 ERP 系统

    2014十大顶级开源ERP系统点评 原文网址链接 http www ctocio com hotnews 17865 html 如今 企业资源规划 ERP 和客户关系管理 CRM 系统的必要性已经被各种组织和企业所认可 ERP和CRM能够直
  • 关于“expected ';', ',' or ')' before '&' token”错误

    在GCC编译器上 出现该错误的主要原因是 在C语言里没有C 所谓的 按引用传递 例如C 可以写这样一个函数 void func int a 函数功能 在C语言无法这样使用 所以需要改为地址引用 void func int a 函数功能 具体
  • 基于Jenkins自动打包并部署Tomcat环境

    目录 1 配置git主机 2 配置jenkins主机 3 配置web主机 4 新建Maven项目 5 验证 Jenkins 自动打包部署结果 Jenkins 的工作原理是先将源代码从 SVN Git 版本控制系统中拷贝一份到本地 然后根据设
  • XSS、CSRF、SSRF漏洞的攻击原理以及防御

    目录 XSS 攻击原理 攻击方式 xss漏洞防范 CSRF CSRF攻击成功的两个必要条件 csrf漏洞防范
  • 安装Esxi系统&重装Esxi系统

    安装esxi系统 或者已经安装了esxi需要重装环境 Dell R730服务器 前期准备 将VMware ESXi 5 5 0的安装镜像要提前准备好 通过光碟 U盘 idrac管理界面挂载方式安装都行 1 加载VMware ESXi 5 5
  • 组装一台电脑需要选购哪些基本部件

    1 机箱 一般电脑的主要零件都放在这里 2 显示器 用来看电脑的工作过程 要不然 你都不知道电脑究竟在做什么 3 键盘和鼠标 向电脑输入有用的命令 让它去为我们工作 4 主板 这里是决定你这台电脑性能的重要零件之一 5 内存 当电脑工作时
  • Go Web编程实战(2)----流程控制语句

    目录 流程控制语句 if else语句 for循环语句 用for循环实现do while 用for循环实现while break指定跳出循环 continue语句 for range循环 遍历数组 遍历字符串 遍历map 遍历通道 chan