goweb编程实战----流程控制语句(代码片段)

李元静 李元静     2022-12-06     670

关键词:

目录

流程控制语句

每个语言都会介绍到流程控制语句,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 =[]int1,2,3,4,5,6,7,8,9,0

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

//声明数组情况下的遍历
var num =[]int1,2,3,4,5,6,7,8,9,2
for key,value :=range num
	fmt.Println("key=",key,"value=",value)

//直接遍历临时创建的数组
for key,value :=range []int1,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个方法,获取用户名与邮箱,但其实他们抛出的异常都相同,那么可以直接都跳转到指定的标签处,进行相同异常的处理。而不必每个都抛出异常写一遍。

goweb编程实战----流程控制语句(代码片段)

目录流程控制语句if-else语句for循环语句用for循环实现do-while用for循环实现whilebreak指定跳出循环continue语句for-range循环遍历数组遍历字符串遍历map遍历通道(channel)switch-case语句一个分支多个值分支表达式goto语句流程控制... 查看详情

goweb编程实战----函数(代码片段)

目录前言声明与使用函数返回多个值return可以为空函数参数参数值传递引用传递可选函数匿名函数匿名函数的定义匿名函数的调用回调函数defer延迟语句defer与return的执行顺序defer常用场景前言本篇博文主要介绍Go语言的函数定义... 查看详情

goweb编程实战----函数(代码片段)

目录前言声明与使用函数返回多个值return可以为空函数参数参数值传递引用传递可选函数匿名函数匿名函数的定义匿名函数的调用回调函数defer延迟语句defer与return的执行顺序defer常用场景前言本篇博文主要介绍Go语言的函数定义... 查看详情

goweb编程实战----反射(代码片段)

目录反射反射的3大原则“接口类型变量”转换为“反射类型对象”“反射类型对象”转换为“接口类型变量”“反射类型对象”修改(值必“可写的”)反射与其他语言一样,Go语言的反射同样是指,计算机程序... 查看详情

goweb编程实战----反射(代码片段)

目录反射反射的3大原则“接口类型变量”转换为“反射类型对象”“反射类型对象”转换为“接口类型变量”“反射类型对象”修改(值必“可写的”)反射与其他语言一样,Go语言的反射同样是指,计算机程序... 查看详情

goweb编程实战----数据类型(代码片段)

...类型、切片类型、Map类型以及结构体类型。布尔型与其他编程语言一样,Go语言的布尔型只可以是tr 查看详情

goweb编程实战----面向对象编程(代码片段)

...有类的概念,但这并不意味着Go语言不支持面向对象编程,毕竟面向对象只是一种编程思想。封装属性其实,学习过C语言都应该清楚,结构体是一个类类的结构,也就是说结构体是类的一种简化形式。 查看详情

goweb编程实战----面向对象编程(代码片段)

...有类的概念,但这并不意味着Go语言不支持面向对象编程,毕竟面向对象只是一种编程思想。封装属性其实,学习过C语言都应该清楚,结构体是一个类类的结构,也就是说结构体是类的一种简化形式。 查看详情

goweb编程实战----并发goroutine(代码片段)

目录什么是goroutine?使用方式什么是goroutine?在Go语言中,每一个并发执行的活动被称为goroutine。使用go关键字可以创建goroutine,其完整定义如下:gofunc_name()其中,go是关键字,需要放在一个需要调用的函数之前&#... 查看详情

goweb编程实战----并发goroutine(代码片段)

目录什么是goroutine?使用方式什么是goroutine?在Go语言中,每一个并发执行的活动被称为goroutine。使用go关键字可以创建goroutine,其完整定义如下:gofunc_name()其中,go是关键字,需要放在一个需要调用的函数之前&#... 查看详情

goweb编程实战----并发goroutine(代码片段)

目录什么是goroutine?使用方式什么是goroutine?在Go语言中,每一个并发执行的活动被称为goroutine。使用go关键字可以创建goroutine,其完整定义如下:gofunc_name()其中,go是关键字,需要放在一个需要调用的函数之前&#... 查看详情

goweb编程实战----创建客户端(代码片段)

目录创建一个客户端Get()请求Post()请求请求头设置创建一个客户端在Go语言的net/http包中,还提供了一个被称为Client的结构体。该结构体提供了Get()、Post()两个请求函数。下面,我们来分别使用代码实现这些请求。Get()请求... 查看详情

goweb编程实战----go语言的基础语法(代码片段)

目录前言HelloWorld包的声明与导入运行程序方式基础语法注释标识符变量常量运算符前言很高兴能够一起和大家学习Go语言,对于它的场景其实很多,包括云计算、容器虚拟化、分布式存储、网络爬虫、运维开发、Web开发... 查看详情

goweb编程实战----go语言的基础语法(代码片段)

目录前言HelloWorld包的声明与导入运行程序方式基础语法注释标识符变量常量运算符前言很高兴能够一起和大家学习Go语言,对于它的场景其实很多,包括云计算、容器虚拟化、分布式存储、网络爬虫、运维开发、Web开发... 查看详情

goweb编程实战----创建http与https服务器端(代码片段)

目录创建一个HTTP服务端ListenAndServe()ServeHTTP()方法的使用示例定义Refer结构体实现ServeHTTP()方法创建一个HTTPS服务端创建证书与私钥创建HTTPS服务端创建一个HTTP服务端其实Go语言创建一个简单的HTTP服务器程序,与JavaWeb的servlet差... 查看详情

goweb编程实战(10)----模板引擎库text/template包的使用(代码片段)

目录前言模板引擎定义模板文件解析模板文件渲染模板实战使用模板创建.tmpl文件创建文件用于解析与渲染模板前言在Go语言中,模板引擎库text/template包主要用于处理任意格式的文本内容,同时还提供了html/template包,... 查看详情

shell编程流程控制——流程控制语句(代码片段)

ifif<判别命令>then命令清单1else命令清单2//可省略fi注意,<判别命令>通常是上述的“test<表达式>”。如果只写<表达式>需要用中括号括起来。(中括号两边要有空格)如果判别命令返回0(表达式成立)反之... 查看详情

goweb编程实战----并发goroutine(代码片段)

目录什么是goroutine?使用方式什么是goroutine?在Go语言中,每一个并发执行的活动被称为goroutine。使用go关键字可以创建goroutine,其完整定义如下:gofunc_name()其中,go是关键字,需要放在一个需要调用的函数之前&#... 查看详情