【30天熟悉Go语言】8 Go流程控制之循环结构for range、goto、break、continue

文章目录

  • 一、前言
  • 二、for循环
    • 1、语法
      • 1)和Java的for循环一样
      • 2)和Java的while一样
      • 3)和Java的for(;;)一样
    • 2、for语句执行过程
  • 三、for range
    • 1、语法
      • 1)遍历key、value
        • 只遍历value
      • 2)遍历key
  • 四、关键字
    • 1、break
      • 1)双重/多层for循环中使用
      • 3)通过标签指定要结束的for循环
    • 2、continue
      • 1)双重/多层for循环中使用
      • 2)通过标签指定要continue的for循环
    • 3、goto
    • 4、return
  • 五、总结
    • 对比Java来看

一、前言

在这里插入图片描述

Go系列文章:

  1. GO开篇:手握Java走进Golang的世界
  2. 2 Go开发环境搭建、Hello World程序运行
  3. 3 Go编程规约和API包
  4. 4 Go的变量、常量、运算符
  5. 5 Go 基本数据类型
  6. 6 Go 复杂数据类型之指针
  7. 7 Go流程控制之分支结构if、switch

Go专栏传送链接:https://blog.csdn.net/saintmm/category_12326997.html

二、for循环

for 循环是一个循环控制结构,可以指定循环执行的次数
在这里插入图片描述

1、语法

Go的for循环有三种方式,仅有一种方式需要像Java一样使用分号。

1)和Java的for循环一样

for init; condition; post { }
  • init: 给控制变量赋初值,一般为:赋值表达式;
  • condition: 循环控制条件,一般为:关系表达式或逻辑表达式;
  • post: 给控制变量增量或减量,一般为:赋值表达式。

示例:计算1 到 100 的数字之和:

package main

import "fmt"

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

控制台输出:
在这里插入图片描述

2)和Java的while一样

for condition { }

init和post参数是可选的,针对上面的实例,我们可以省略它俩,这样的for循环语句就类似于while循环。

示例:当sum 小于 100事,计算sum自加的结果

package main

import "fmt"

func main() {
	sum := 1
	for sum < 100 {
		sum += sum
	}
	fmt.Println(sum)
}

控制台输出:
在这里插入图片描述

3)和Java的for(;;)一样

无限循环,也等价于while(true);

for { }

示例:

package main

import "fmt"

func main() {
	sum := 0
	// 无限循环下去
	for {
		sum++
	}
	// 永远执行不到这条语句
	fmt.Println(sum)
}

想要停止无限循环,在命令窗口按下ctrl + c 。

2、for语句执行过程

  1. 先执行赋值表达式,对变量赋初始化值;
  2. 执行condition表达式,判断赋值表达式init中的变量是否符合条件;
    • 符合循环条件,这执行循环体内的语句;然后执行post表达式,进入第二次循环。在判断condition。
    • 不符合循环条件,终止for循环,执行循环体之外的go语句。

三、for range

for range结构是Go语言特有的一种迭代结构,可以遍历数组、切片、字符串、map、通道,语法上类似于Java中的 foreach 语句。

1、语法

Go的for range循环有两种方式;

1)遍历key、value

for key, value := range coll {
    .....
} 

示例:遍历字符串、数组

package main

import "fmt"

func main() {
	// 遍历字符串
	str := "Hello World"
	for i, value := range str {
		fmt.Printf("第 %d 位 char 的值 = %c\n", i, value)

	}

	// 遍历数组
	numbers := [6]int{1, 2, 3, 5}
	for i, num:= range numbers {
		fmt.Printf("第 %d 位 num 的值 = %d\n", i, num)
	}
}

控制台输出:

在这里插入图片描述

只遍历value

只遍历value 和 遍历 key/value的唯一区别在于用标识符_接收key。

for _, value := range coll {
    .....
} 

示例:遍历字符串

package main

import "fmt"

func main() {
	// 遍历字符串的char值
	str := "Hello World"
	for _, value := range str {
		fmt.Printf("各位的 char值 = %c\n", value)

	}
}

2)遍历key

遍历key仅需要接收key,不需要使用标识符_接收value。语法如下:

for key := range coll {
    .....
} 

示例:遍历数组值

package main

import "fmt"

func main() {
	// 遍历数组中的值
	numbers := [4]int{1, 2, 3, 5}
	for num:= range numbers {
		fmt.Println(num)
	}
}

控制台输出:
在这里插入图片描述

四、关键字

Go流程控制中常用的关键字有四个:break、continue、goto、return

1、break

break用于立即中断for循环。

示例:

package main

import "fmt"

func main() {
	sum := 0
	for i := 1; i <= 100; i ++ {
		sum += i
		if sum > 100 {
			fmt.Println("即将退出循环")
			break
		}
	}
	fmt.Println(sum)
}

控制台输出:
在这里插入图片描述

1)双重/多层for循环中使用

双重for循环中,break只会影响到最近的for循环;

示例:

package main

import "fmt"

func main() {
	for i := 1; i <= 2; i++ {
		for j := i; j < 10; j++ {
			if j == 8  {
				fmt.Println("即将退出内层循环,开启下一个外层循环")
				break
			}
			fmt.Printf("i = %d, j = %d \n", i, j)
		}
	}
	fmt.Println("done")
}

控制台输出:
在这里插入图片描述

3)通过标签指定要结束的for循环

break也可以通过for循环定义的标签,控制break对哪个for循环生效。

示例:

package main

import "fmt"

func main() {
outerFor:
	for i := 1; i <= 2; i++ {
		for j := i; j < 10; j++ {
			if j == 8 {
				fmt.Println("即将退出外层循环")
				break outerFor
			}
			fmt.Printf("i = %d, j = %d \n", i, j)
		}
	}
	fmt.Println("done")
}

控制台输出:
在这里插入图片描述

2、continue

continue用于控制结束本次 循环体的代码逻辑,继续进行for循环中的下一次循环体。

示例:统计1-10的总和,但是不加8

package main

import "fmt"

func main() {
	sum := 0
	for i := 1; i <= 10; i++ {
		if i == 8 {
			fmt.Printf("sum总和不累加:%d \n", i)
			continue
		}
		sum += i
	}
	fmt.Println(sum)
}

控制台输出:
在这里插入图片描述

1)双重/多层for循环中使用

双重for循环中,continue只会影响到最近的for循环;

示例:

package main

import "fmt"

func main() {

	for i := 1; i <= 2; i++ {
		for j := i; j < 10; j++ {
			if j == 8 {
				fmt.Printf("即将跳过当前循环体, i = %d, j = %d \n", i, j)
				continue
			}
			fmt.Printf("i = %d, j = %d \n", i, j)
		}
	}
	fmt.Println("done")
}

控制台输出:
在这里插入图片描述

2)通过标签指定要continue的for循环

continue也可以通过for循环定义的标签,控制continue对哪个for循环生效。

示例:内层循环执行到j == 8时,continue外层循环,内存循环不再执行,这个和break一个效果;

package main

import "fmt"

func main() {
outerFor:
	for i := 1; i <= 2; i++ {
		for j := i; j < 10; j++ {
			if j == 8 {
				fmt.Printf("即将跳过当前循环体, i = %d, j = %d \n", i, j)
				continue outerFor
			}
			fmt.Printf("i = %d, j = %d \n", i, j)
		}
	}
	fmt.Println("done")
}

控制台输出:

在这里插入图片描述

3、goto

Go语言中的的 goto 关键字可以无条件地让程序跳转到指定的行;通常 goto 关键字 与 条件语句一起使用,以实现条件转移能力。

然,在Go程序设计中不建议使用goto关键字,容易造成程序流程的混乱。

示例:

package main

import "fmt"

func main() {

	fmt.Println("Hello 1")
	fmt.Println("Hello 2")
	if 1 == 1 {
		goto label
	}

	fmt.Println("Hello 3")
	fmt.Println("Hello 4")
label:
	fmt.Println("Hello 5")
	fmt.Println("Hello 6")

}

控制台输出:
在这里插入图片描述

4、return

return关键字用于接收某一个函数;

示例:

package main

import "fmt"

func main() {

	for i := 1; i <=100; i ++ {
		fmt.Println(i)
		if i == 18 {
			return
		}
	}
	fmt.Println("done")
}

控制台输出:
在这里插入图片描述

五、总结

go语言的for循环用于基本和Java一样;特殊注意continue / break 到指定for循环的用法。
go的for range可以理解为Java中的foreach。

对比Java来看

Go语言中,while(for true)、break、continue、return和Java中使用一样。

  • Java中的for后需要需要跟小括号(),Go中不需要;

Java中的for

for (int i = 1; i < 10; i++) {
....
}

Go中的for

for i := 1; i < 10; i++ {
....
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/31786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java】如何优雅的关闭线程池

文章目录 背景一、线程中断 interrupt二、线程池的关闭 shutdown 方法2.1、第一步&#xff1a;advanceRunState(SHUTDOWN) 把线程池置为 SHUTDOWN2.2、第二步&#xff1a;interruptIdleWorkers() 把空闲的工作线程置为中断2.3、 第三步&#xff1a;onShutdown() 一个空实现&…

Java POI (1)—— 数据读写操作快速入门

一、Excel的版本区别&#xff08;03版和07版&#xff09; 所谓“03版” 和 “07版”&#xff0c;指的是 Microsoft Excel 版本号。这些版本号代表着不同的Excel 文件格式。2003版 Excel 使用的文件格式为 .xls&#xff0c;而2007版开始使用新的文件格式 .xlsx。 . xlsx 文件格式…

【Spring 】项目创建和使用

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 谈起Java 圈子里的框架&#xff0c;最年长最耀眼的莫过于 Spring 框架啦&#xff0c;如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这…

VulnHub靶机渗透:SKYTOWER: 1

SKYTOWER: 1 靶机环境介绍nmap扫描端口扫描服务扫描漏洞扫描总结 80端口目录爆破 3128端口获取立足点获取立足点2提权总结 靶机环境介绍 https://www.vulnhub.com/entry/skytower-1,96/ 靶机IP&#xff1a;192.168.56.101 kali IP&#xff1a;192.168.56.102 nmap扫描 端口扫…

使用mpi并行技术实现wordcount算法

【问题描述】 编写程序统计一个英文文本文件中每个单词的出现次数&#xff08;词频统计&#xff09;&#xff0c;并将统计结果按单词字典序输出到屏幕上。 注&#xff1a;在此单词为仅由字母组成的字符序列。包含大写字母的单词应将大写字母转换为小写字母后统计。 【输入形…

ChatGPT使用的SSE技术是什么?

在现代web应用程序中&#xff0c;实时通信变得越来越重要。HTTP协议的传统请求/响应模式总是需要定期进行轮询以获得最新的数据&#xff0c;这种方式效率低下并且浪费资源。因此&#xff0c;出现了一些新的通信技术&#xff0c;如WebSocket和SSE。但是&#xff0c;GPT为什么选择…

分布式数据库架构

分布式数据库架构 1、MySQL常见架构设计 对于mysql架构&#xff0c;一定会使用到读写分离&#xff0c;在此基础上有五种常见架构设计&#xff1a;一主一从或多从、主主复制、级联复制、主主与级联复制结合。 1.1、主从复制 这种架构设计是使用的最多的。在读写分离的基础上…

JS 介绍 Babel 的使用及 presets plugins 的概念

一、Babel 是什么 Bebal 可以帮助我们将新 JS 语法编译为可执行且兼容旧浏览器版本的一款编译工具。 举个例子&#xff0c;ES6&#xff08;编译前&#xff09;&#xff1a; const fn () > {};ES5&#xff08;编译后&#xff09;&#xff1a; var fn function() {}二、B…

设计模式-抽象工厂模式

抽象工厂模式 1、抽象工厂模式简介2、具体实现 1、抽象工厂模式简介 抽象工厂模式(Abstract Factory Pattern)在工厂模式尚添加了一个创建不同工厂的抽象接口(抽象类或接口实现)&#xff0c;该接口可叫做超级工厂。在使用过程中&#xff0c;我们首先通过抽象接口创建不同的工厂…

【HTML界面设计(二)】说说模块、登录界面

记录很早之前写的前端界面&#xff08;具体时间有点久远&#xff09; 一、说说模板 采用 适配器&#xff08;Adapter&#xff09;原理 来设计这款说说模板&#xff0c;首先看一下完整效果 这是demo样图&#xff0c;需要通过业务需求进行修改的部分 这一部分&#xff0c;就是dem…

Redis系列--布隆过滤器(Bloom Filter)

一、前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意ip地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xff0c;如&#xff1a;redis存储…

宏景eHR SQL注入漏洞复现(CNVD-2023-08743)

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合&#xff0c;满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR 存在SQL注入漏洞&#xff0c;未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令&#xff0c;从而窃取数…

如何在大规模服务中迁移缓存

当您启动初始服务时&#xff0c;通常会过度设计以考虑大量流量。但是&#xff0c;当您的服务达到爆炸式增长阶段&#xff0c;或者如果您的服务请求和处理大量流量时&#xff0c;您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…

docker基础

文章目录 通过Vagrant安装虚拟机修改虚拟机网络配置 docker CE安装(在linux上)docker desktop安装(在MacOS上)Docker架构关于-阿里云镜像加速服务配置centos卸载docker 官网: http://www.docker.com 仓库: https://hub.docker.com Docker安装在虚拟机上&#xff0c;可以通过V…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

[MySQL]不就是SQL语句

前言 本期主要的学习目标是SQl语句中的DDL和DML实现对数据库的操作和增删改功能&#xff0c;学习完本章节之后需要对SQL语句手到擒来。 1.SQL语句基本介绍 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的编程语言。它允许用户在数据库中存…

双因素身份验证在远程访问中的重要性

在快速发展的数字环境中&#xff0c;远程访问计算机和其他设备已成为企业运营的必要条件。无论是在家庭办公室运营的小型初创公司&#xff0c;还是团队分散在全球各地的跨国公司&#xff0c;远程访问解决方案都能保证工作效率和连接性&#xff0c;能够跨越距离和时间的阻碍。 …

7Z045 引脚功能详解

本文针对7Z045芯片&#xff0c;详细讲解硬件设计需要注意的技术点&#xff0c;可以作为设计和检查时候的参考文件。问了方便实用&#xff0c;按照Bank顺序排列&#xff0c;包含配置Bank、HR Bank、HP Bank、GTX Bank、供电引脚等。 参考文档包括&#xff1a; ds191-XC7Z030-X…

怎么计算 flex-shrink 的缩放尺寸

计算公式: 子元素的宽度 - (子元素的宽度的总和 - 父盒子的宽度) * (某个元素的flex-shrink / flex-shrink总和) 面试问题是这样的下面 left 和 right 的宽度分别是多少 * {padding: 0;margin: 0;}.container {width: 500px;height: 300px;display: flex;}.left {width: 500px…

红日靶场(一)外网到内网速通

红日靶场&#xff08;一&#xff09; 下载地址&#xff1a;http://vulnstack.qiyuanxuetang.net/vuln/detail/2/ win7:双网卡机器 win2003:域内机器 win2008域控 web阶段 访问目标机器 先进行一波信息收集&#xff0c;扫一下端口和目录 扫到phpmyadmin&#xff0c;还有一堆…