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

news2024/12/23 15:57:54

文章目录

  • 一、前言
  • 二、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
  • 五、总结

一、前言

在这里插入图片描述

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。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Rust日报】2023-06-18 2023第三届中国Rust开发者大会圆满结束

2023第三届中国Rust开发者大会 发布 Mailtutan v0.3.0 - 用于测试和开发环境的 SMTP 服务器 变更日志&#xff1a; 添加数据修剪支持添加邮件目录存储向 API 添加删除消息添加 TLS 支持添加 SMTP 普通身份验证支持 github: https://github.com/mailtutan/mailtutan/ Kani 0.30.…

测试工程师个人简历模板

测试工程师个人简历模板篇1 姓 名&#xff1a; _x 性 别&#xff1a; 男 婚姻状况&#xff1a; 已婚 民 族&#xff1a; 汉族 户 籍&#xff1a; 湖南-岳阳 年 龄&#xff1a; 27 现所在地&#xff1a; 广东-深圳 身 高&#xff1a; 176cm 希望地区&#xff1a; 广东、 广…

Q-learning解决悬崖问题

Q-learning是一个经典的强化学习算法&#xff0c;是一种基于价值(Value-based)的算法&#xff0c;通过维护和更新一个价值表格(Q表格)进行学习和预测。 Q-learning是一种off-policy的策略&#xff0c;也就是说&#xff0c;它的行动策略和Q表格的更新策略是不一样的。 行动时&am…

vue2和vue3组件v-model区别

前言 单向数据流&#xff0c;父组件传给子组件的数据&#xff0c;子组件只能展示&#xff0c;不能修改&#xff0c;如果需要修改则需要emit事件让父组件修改 有些时候&#xff0c;一些组件并不是通过input来进行触发事件。也就是说value和input事件在大多数情况下能够适用&am…

ROS2性能分析

文章&#xff1a;Performance Analysis of ROS2 作者&#xff1a;Deepak Charan Logavaseekaran, Rakshith Macha Billava 编辑&#xff1a;点云PCL 欢迎各位加入知识星球&#xff0c;获取PDF论文&#xff0c;欢迎转发朋友圈。文章仅做学术分享&#xff0c;如有侵权联系删文。未…

3-dubbo框架,应用程序,模块领域模型Model对象的初始化

在上一章中我们详细看了服务配置ServiceConfig类型的初始化,不过我们跳过了AbstractMethodConfig的构造器中创建模块模型对象的过程 那为什么会在Dubbo3的新版本中加入这个域模型呢,主要有如下原因 之前dubbo都是只有一个作用域的&#xff0c;通过静态类 属性共享 增加域模型是…

MacBook充电限制工具AlDente Pro

AlDente Pro是一款适用于Mac操作系统的小工具&#xff0c;可以帮助您限制电池充电量以延长电池寿命。通常情况下&#xff0c;电池在充满的状态下会继续接受电源充电&#xff0c;这可能会导致电池寿命缩短。使用AlDente Pro&#xff0c;您可以设置电池只充到特定的充电水平&…

使用omp并行技术实现快排加速

快排基本原理&#xff1a; 快速排序可以说是最为常见的排序算法&#xff0c;冒泡排序时间复杂度达到了O&#xff08;N2&#xff09;&#xff0c;而桶排序容易造成浪费空间。快排&#xff08;Quicksort&#xff09;就成为了不错的选择。 1、原理&#xff1a;快排需要找一个数作…

【Nexus】上传jar至Nexus的两种方式

目录 一、前言二、pom文件添加推送代码配置1、配置pom.xml文件2、配置maven的settings.xml文件3、执行上传①、点击Maven-Lifecycle-deploy-Run Maven Build②、出现以下提示则上传成功③、这时&#xff0c;在Nexus的nexus-snapshot-hosted&#xff08;快照类型的托管资源库&am…

【Python】函数进阶 ③ ( 函数作为参数传递 )

文章目录 一、函数参数传递类型二、代码示例 - 函数参数传递类型 一、函数参数传递类型 之前介绍的函数 , 都是 接收具体的 变量 或 字面量 数据 作为参数 , 如 : 数字 / 布尔值 / 字典 / 列表 / 元组 等 ; 函数 也可以作为参数 , 传入另一个函数中 ; 在 Python 中&#xff0…

主成分分析——SPSS实例分析

主成分分析是用原始变量的线性组合来表示主成分&#xff0c;且主成分彼此之间互不相关&#xff0c;且能反映出原始数据的绝大部分信息。 一般来说&#xff0c;当研究的问题涉及到多变量且变量之间存在很强的相关性时&#xff0c;我们可考虑使用主成分分析的方法来对数据进行简化…

智能的突破或许在智能之外

人工智能已经取得了不少令人瞩目的成果&#xff0c;但是仍然存在着许多问题和挑战&#xff0c;这些问题和挑战也许只能通过跨学科的合作和人类的智慧来解决&#xff0c;因此智能的突破在智能之外。在人工智能的决策过程中&#xff0c;往往会缺乏人类的道德判断和社会责任感&…

2018年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2018 年全国硕士研究生入学统一考试 管理类专业硕士学位联考 英语&#xff08;二&#xff09;试卷 考生须知 1&#xff0e;考生必须严格遵守各项考场规则。 2&#xff0e;答题前&#xff0c;考生将答题卡上的“姓名”、“考生编号”等信息填写清楚&#xff0c;并与准考证上的致…

【SpringCloud】Eureka 案例上手稍微带点原理

文章目录 1. 前置工作1.1 搭建 user-server1.1.1 pom1.1.2 po&#xff0c;mapper&#xff0c;controller1.1.3 yml1.1.4 启动类1.1.5 启动并访问 1.2 搭建 order-server1.2.1 pom1.2.2 po mapper controller1.2.3 yml1.2.4 启动类1.2.5 启动并访问 1.3 两个服务通信 2. Eureka2…

Qt Xml的读、写、修改、删除

一、说明 Xml文件的创建、读取、修改、删除以下图格式为例。 二、导入xml QT core gui xml三、创建Xml void MainWindow::Xml_Write(QString path) {//! 打开或创建文件QFile file(path);if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) return; //! …

【MySQL篇】Select语句原理详解

文章目录 MYSQL体系结构模块详解架构分层连接层服务层存储引擎 SQL的执行流程连接查询缓存语法解析和预处理词法解析语法分析预处理器 查询优化器执行计划存储引擎存储引擎基本介绍如何选择存储引擎&#xff1f; 执行引擎举例说明 对于一个开发工程师来说&#xff0c;了解一下 …

C语言读写ini配置文件

环境 windows 10 64bitClion 2023.1 ini简介 ini 文件格式是一种用于保存配置信息的简单文本格式。它通常由多个节(section)组成&#xff0c;每个节包含多个键值对(key-value pair)。 下面是 ini 文件的基本语法规则 一个ini文件由多个节组成&#xff0c;每个节用方括号([])括起…

《Java黑皮书基础篇第10版》 第17章【笔记】

第十七章 二进制I/O 17.1 引言 文件可以不严谨的分类为文本文件和二进制文件。文本文件指的是可以用文件编辑器进行查看和修改的&#xff0c;二进制文件则不可以使用文本编辑器查看和修改。 例如&#xff0c;Test.java文件储存在文本文件中&#xff0c;因此可以用文本编辑器…

MapReduce程序基本架构

MapReduce程序是以&#xff08;键/值&#xff09;对的形式来处理数据的&#xff0c;即可以通过以下的形式来表示&#xff1a; map: (K1,V1) ➞ list(K2,V2) reduce: (K2,list(V2)) ➞ list(K3,V3) 不令人惊奇的是&#xff0c;这是一种超越一般数据的数据流表示形式。在本文中…

使用PyMC进行时间序列分层建模

在统计建模领域&#xff0c;理解总体趋势的同时解释群体差异的一个强大方法是分层(或多层)建模。这种方法允许参数随组而变化&#xff0c;并捕获组内和组间的变化。在时间序列数据中&#xff0c;这些特定于组的参数可以表示不同组随时间的不同模式。 今天&#xff0c;我们将深…