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

简介: Go Web编程实战(2)----流程控制语句(二)

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个方法,获取用户名与邮箱,但其实他们抛出的异常都相同,那么可以直接都跳转到指定的标签处,进行相同异常的处理。而不必每个都抛出异常写一遍。

相关文章
|
5天前
|
Java 应用服务中间件 测试技术
深入探索Spring Boot Web应用源码及实战应用
【5月更文挑战第11天】本文将详细解析Spring Boot Web应用的源码架构,并通过一个实际案例,展示如何构建一个基于Spring Boot的Web应用。本文旨在帮助读者更好地理解Spring Boot的内部工作机制,以及如何利用这些机制优化自己的Web应用开发。
31 3
|
1天前
|
缓存 监控 安全
Django框架在大型Web应用中的架构设计与实战
【5月更文挑战第18天】Django框架在构建大型Web应用中扮演重要角色,采用分层架构(数据、业务逻辑、表示层)和多应用组织模式,结合缓存策略(如Memcached、Redis)提升性能。通过异步处理、分布式部署提高响应速度和扩展性。关注数据分区、安全设计及监控日志,确保系统高效、稳定。Django为复杂业务提供坚实基础,助力打造卓越Web系统。
18 7
|
2天前
|
JSON JavaScript 前端开发
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
web前端入门到实战:32道常见的js面试题,2024年最新秋招是直接面试吗
|
2天前
|
JavaScript 前端开发 程序员
web前端入门到实战:32道常见的js面试题(1),面试哪些
web前端入门到实战:32道常见的js面试题(1),面试哪些
|
4天前
|
负载均衡 Go 调度
使用Go语言构建高性能的Web服务器:协程与Channel的深度解析
在追求高性能Web服务的今天,Go语言以其强大的并发性能和简洁的语法赢得了开发者的青睐。本文将深入探讨Go语言在构建高性能Web服务器方面的应用,特别是协程(goroutine)和通道(channel)这两个核心概念。我们将通过示例代码,展示如何利用协程处理并发请求,并通过通道实现协程间的通信和同步,从而构建出高效、稳定的Web服务器。
|
5天前
|
存储 人工智能 测试技术
python自动化测试实战 —— CSDN的Web页面自动化测试
python自动化测试实战 —— CSDN的Web页面自动化测试
194 0
|
5天前
|
监控 安全 Shell
记一次应急靶场实战--web1
本次应急靶机题目训练主要是为了应对接下来的护网面试和比赛,顺便提高一下自己对应急和溯源的实战能力,这里有两个逗比的事情发生,一是用D盾分析的时候,电脑环境监测到了,把要分析的马杀了,二是,发现无法使用脚本,在自己本机实验,电脑差点搞崩,还好佬在制作时候只是单次运行会占用.切记不要本机实验,一定要在虚拟机中进行测试.
|
5天前
|
JSON 监控 安全
Golang深入浅出之-Go语言中的反射(reflect):原理与实战应用
【5月更文挑战第1天】Go语言的反射允许运行时检查和修改结构,主要通过`reflect`包的`Type`和`Value`实现。然而,滥用反射可能导致代码复杂和性能下降。要安全使用,应注意避免过度使用,始终进行类型检查,并尊重封装。反射的应用包括动态接口实现、JSON序列化和元编程。理解反射原理并谨慎使用是关键,应尽量保持代码静态类型。
25 2
|
5天前
|
数据库连接 Go 数据库
【Go 语言专栏】Go 语言中的错误注入与防御编程
【4月更文挑战第30天】本文探讨了Go语言中的错误注入和防御编程。错误注入是故意引入错误以测试系统异常情况下的稳定性和容错性,包括模拟网络故障、数据库错误和手动触发错误。防御编程则强调编写代码时考虑并预防错误,确保程序面对异常时稳定运行。Go语言的错误处理机制包括多返回值和自定义错误类型。结合错误注入和防御编程,可以提升软件质量和可靠性,打造更健壮的系统。开发人员应重视这两方面,以实现更优质的软件产品。
|
5天前
|
缓存 监控 测试技术
【Go语言专栏】使用Go语言构建高性能Web服务
【4月更文挑战第30天】本文探讨了使用Go语言构建高性能Web服务的策略,包括Go语言在并发处理和内存管理上的优势、基本原则(如保持简单、缓存和并发控制)、标准库与第三方框架的选择、编写高效的HTTP处理器、数据库优化以及性能测试和监控。通过遵循最佳实践,开发者可以充分利用Go语言的特性,构建出高性能的Web服务。