100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

news2024/11/28 19:34:30

在这里插入图片描述

🌷 博主 libin9iOak带您 Go to Golang Language.✨
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🐥

100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

    • 摘要:
    • 引言:
  • 一、程序的流程结构
  • 二、循环语句
    • 2.1 for语句
    • 2.2 for循环变体
    • 2.2 多层for循环
  • 三、跳出循环的语句
    • 1、 break语句
    • 2、continue语句
  • 四、goto语句
    • 拓展:
    • 今日学习总结:
  • 结语

摘要:

本篇博客介绍了 Go 语言程序中的循环语句,包括 for 循环、循环变体和多层 for 循环。同时讨论了跳出循环的语句,包括 break 和 continue,以及介绍了 goto 语句的使用。通过学习本篇内容,可以加深对 Go 语言循环语句的理解和应用。

引言:

在编程中,循环语句是一种重要的控制结构,它允许我们重复执行一段代码块,直到满足特定条件为止。Go 语言提供了灵活且功能丰富的循环语句,可以帮助我们实现各种重复操作和迭代逻辑。本篇博客将深入讨论 Go 语言的循环语句,帮助您掌握循环的使用技巧和注意事项。

一、程序的流程结构

程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。

顺序结构:代码从上向下逐行的执行

选择结构:条件满足,某些代码才会被执行。0-1次

​ if语句,switch语句

循环结构:条件满足,某些代码会被反复的多次执行。0-n次

​ for语句

二、循环语句

循环语句表示条件满足,可以反复的执行某段代码。

在 Go 语言中,有三种主要的循环语句:

  1. for 循环:for 循环用于重复执行一个代码块,可以根据条件进行控制。Go 语言提供了多种 for 循环的形式,包括:

    • for 初始化语句; 条件语句; 后续语句 { 代码块 }:经典的 for 循环形式。
    • for 条件语句 { 代码块 }:类似于其他语言的 while 循环,只有条件语句,没有初始化和后续语句。
    • for { 代码块 }:类似于其他语言的无限循环,没有条件语句,会一直执行代码块,直到遇到 breakreturn 才会退出循环。
  2. while 循环:Go 语言没有专门的 while 关键字,但可以使用 for 循环来模拟 while 循环,只需要省略初始化语句和后续语句即可,例如:

    for 条件语句 {
        // 代码块
    }
    
  3. range 循环:range 循环用于遍历数组、切片、字符串、映射等可迭代对象的元素。它返回每个元素的索引和值。例如:

    for 索引, 值 := range 可迭代对象 {
        // 代码块
    }
    

    注意:如果只关心值而不需要索引,可以使用下划线 _ 来忽略索引变量。

这些循环语句可以根据不同的需求选择合适的形式来使用。

今天主要介绍for循环, range 后面章节再学习!

2.1 for语句

语法结构:

for init; condition; post { }

初始化语句只执行一次。在初始化循环之后,将检查该条件。如果条件计算为true,那么{}中的循环体将被执行,然后是post语句。post语句将在循环的每次成功迭代之后执行。在执行post语句之后,该条件将被重新检查。如果它是正确的,循环将继续执行,否则循环终止。

示例代码:

package main

import "fmt"
/*
	for循环:某些代码会被多次的执行
	语法:
		for 表达式1;表达式2;表达式3{
			循环体
		}
*/
func main() {
	// 快捷键fori
	for i := 0; i < 6; i++ {
		fmt.Println("Hello Go ! wx: libin9iOak  ")
		fmt.Printf(" %d  ", i)
	}
}


在for循环中声明的变量仅在循环范围内可用。因此,i不能在外部访问循环。

在这里插入图片描述

2.2 for循环变体

所有的三个组成部分,即初始化、条件和post都是可选的。

for condition { }

效果与while相似

for { }

效果与for(;😉 一样

代码案例:


package main

import "fmt"

func main() {
	/*
	1. 标准写法:
		for 表达式1;表达式2;表达式3{
			循环体
		}
	2.同时省略表达式1和表达式3
		for 表达式2{

		}
	相当于while(条件)
	3.同时省略3个表达式
		for{

		}
	相当于while(true)
	注意点:当for循环中,省略了表达式2,就相当于直接作用在了true上

	4.其他的写法:for循环中同时省略几个表达式都可以。。
		省略表达式1:
		省略表达式2:循环永远成立-->死循环
		省略表达式3:
	 */
	i := 1
	for i <= 5 {
		fmt.Println(i)
		i++
	}
	fmt.Println("-->",i)

	fmt.Println("------------")
	for{
		fmt.Println("i--->",i)
		i++
	}
}

在这里插入图片描述

for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环

for key, value := range oldMap {
    newMap[key] = value
}
package main

import "fmt"

func main() {

   var b int = 15
   var a int

   numbers := [6]int{1, 2, 3, 5} 

   /* for 循环 */
   for a := 0; a < 10; a++ {
      fmt.Printf("a 的值为: %d\n", a)
   }

   for a < b {
      a++
      fmt.Printf("a 的值为: %d\n", a)
      }

   for i,x:= range numbers {
      fmt.Printf("第 %d 位 x 的值 = %d\n", i,x)
   }   
}

运行结果:

a 的值为: 0
a 的值为: 1
a 的值为: 2
a 的值为: 3
a 的值为: 4
a 的值为: 5
a 的值为: 6
a 的值为: 7
a 的值为: 8
a 的值为: 9
a 的值为: 1
a 的值为: 2
a 的值为: 3
a 的值为: 4
a 的值为: 5
a 的值为: 6
a 的值为: 7
a 的值为: 8
a 的值为: 9
a 的值为: 10
a 的值为: 11
a 的值为: 12
a 的值为: 13
a 的值为: 14
a 的值为: 15
第 0 位 x 的值 = 1
第 1 位 x 的值 = 2
第 2 位 x 的值 = 3
第 3 位 x 的值 = 5
第 4 位 x 的值 = 0
第 5 位 x 的值 = 0

2.2 多层for循环

for循环中又有循环嵌套,就表示多层循环了。


package main

import "fmt"

func main() {
	for i := 1; i <= 3; i++ {
		for j := 1; j <= 3; j++ {
			fmt.Printf("i: %d, j: %d\n", i, j)
		}
	}
}


在这里插入图片描述

三、跳出循环的语句

1、 break语句

break:跳出循环体。break语句用于在结束其正常执行之前突然终止for循环

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i > 5 {
            break //loop is terminated if i > 5
        }
        fmt.Printf("%d ", i)
    }
    fmt.Printf("\nline after for loop")
}

2、continue语句

continue:跳出一次循环。continue语句用于跳过for循环的当前迭代。在continue语句后面的for循环中的所有代码将不会在当前迭代中执行。循环将继续到下一个迭代。

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    for i := 1; i <= 10; i++ {
        if i%2 == 0 {
            continue
        }
        fmt.Printf("%d ", i)
    }
}

四、goto语句

goto:可以无条件地转移到过程中指定的行。

语法结构:

goto label;
..
..
label: statement;

在这里插入图片描述

package main

import "fmt"

func main() {
   /* 定义局部变量 */
   var a int = 10

   /* 循环 */
   LOOP: for a < 20 {
      if a == 15 {
         /* 跳过迭代 */
         a = a + 1
         goto LOOP
      }
      fmt.Printf("a的值为 : %d\n", a)
      a++     
   }  
}

下面是一个简单的 Go 语言代码示例,展示了如何使用 goto 语句:

package main

import "fmt"

func main() {
	i := 0

loop:
	if i < 5 {
		fmt.Println(i)
		i++
		goto loop
	}

	fmt.Println("Loop finished")
}

在上述示例中,我们使用 goto 语句实现了一个简单的循环。初始时,我们将 i 的值设置为 0。然后,我们使用 loop 标签标记了一个代码块的位置。

if 语句中,我们检查 i 的值是否小于 5。如果满足条件,就打印 i 的值,然后将 i 递增,并使用 goto 语句跳转到 loop 标签所在的代码块。

这样,每次循环迭代时,会打印当前的 i 值,然后通过 goto 跳转回 loop 标签,继续下一次迭代,直到 i 的值不再小于 5。

最终,当 i 的值达到 5 时,不满足 if 语句的条件,循环结束,程序会打印出 “Loop finished”。

需要注意的是,尽管 goto 语句可以用于控制流,但在实际开发中,应尽量避免使用它,以免导致代码难以理解和维护。通常,结构化的控制流语句(如 forifswitch 等)更易于理解和维护。

统一错误处理
多处错误处理存在代码重复时是非常棘手的,例如:

		err := firstCheckError()
    if err != nil {
        goto onExit
    }
    err = secondCheckError()
    if err != nil {
        goto onExit
    }
    fmt.Println("done")
    return
onExit:
    fmt.Println(err)
    exitProcess()



拓展:

除了基本的 for 循环和循环控制语句,Go 语言还提供了其他强大的控制结构和语法特性。例如,range 关键字可以用于迭代数组、切片、字符串、映射等数据结构。此外,通过使用标签和 goto 语句,我们可以在需要的时候灵活地控制程序的流程。在今后的学习过程中,您还将了解更多关于 Go 语言的高级特性和技术。

今日学习总结:

通过本篇博客,我们深入学习了 Go 语言中的循环语句。我们了解了 for 循环的基本语法和用法,并学习了循环的变体和多层循环的实现。同时,我们还探讨了跳出循环的语句,包括 break 和 continue,以及介绍了 goto 语句的使用。这些内容为我们理解和掌握 Go 语言中的循环提供了坚实的基础。在今后的学习和实践中,我们将能够更好地运用循环语句来解决实际问题,并进一步提升我们的编程能力。

在这里插入图片描述

结语

通过今天的学习,您已经踏上了Golang的学习之旅。在未来的日子里,您将探索Golang的各个方面,从基础概念到高级技巧,从实际应用到性能优化。
学习一门编程语言是一个持续的过程,每一天都是您向Golang的精通迈进的重要一步。我鼓励您坚持每天学习,保持热情和好奇心,解决挑战并享受成功的喜悦。

在您的学习旅程中,不要忘记参与社区和与其他Golang开发者交流。分享您的见解和经验,向他人学习,并在开源项目或实际应用中展示您的技能。

如果您在学习过程中遇到困难或有任何问题,不要犹豫向社区和专家寻求帮助。持续学习,勇敢探索,您将在Golang领域取得令人瞩目的成就。

最后,感谢您的阅读和支持!祝愿您在未来的每一天中都能够成为一名精通Golang的开发者!

期待听到您在学习过程中的进展和成就。如果您需要进一步的帮助,请随时告诉我。祝您在学习Golang的旅程中取得巨大成功!

如果您在学习过程中有任何疑惑,请点击下方名片,带您一对一快速入门 Go语言 的世界 ~

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

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

相关文章

UWB定位的两种解法

UWB(Ultra-Wideband)技术是一种短脉冲无线电技术(短脉冲意味着信号的带宽很大&#xff0c;因此称为超宽带)&#xff0c;其应用非常广泛&#xff0c;其中之一就是室内定位&#xff0c;通过计算信号传播的时间差&#xff0c;可以得到标签和基站之间的距离,如果有足够多的基站&…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

【Elasticsearch】 之 Translog/FST/FOR/RBM算法

目录 Translog FST/FOR/RBM算法解析 FST FOR&#xff08;Frame of Reference&#xff09;: RBM&#xff08;Roaring Bitmaps&#xff09;-(for filter cache) Translog es是近实时的存储搜索引。近实时&#xff0c;并不能保证被立刻看到。数据被看到的时候数据已经作为一…

工业级以太网RJ45温湿度监控系统解决方案之关键POE供电温湿度传感器

目 录 一、关键词…………………………………………………………………………3 二、 产品概述………………………………………………………………………3 三、 应用范围………………………………………………………………………3 四、 产品特点………………………………

Linux0.11内核源码解析-file_dev.c

目录 功能描述 int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) int file_write(struct m_inode * inode, struct file * filp, char * buf, int count) 功能描述 该文件主要是由两个函数file_read()和file_write()组成&#xff0c;提供…

Nginx网站服务——服务基础

文章目录 一.Nginx服务基础1.关于Nginx的特点2.简述Nginx和Apache的差异3.Nginx 相对于 Apache 的优点4.Apache 相对于 Nginx 的优点5.阻塞与非阻塞6.同步与异步7.nginx的应用场景 二.编译安装nginx服务1.在线安装nginx1.1 yum部署Nginx1.2 扩展源安装完后直接安装Nginx 2.ngin…

MySQL数据库---存储引擎(MyISAM与InnoDB)

目录 前言一、存储引擎概念介绍二、MyISAM三、InnoDB四、配置合适的存储引擎总结 前言 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧…

Vue中如何进行图像识别与人脸对比

Vue中如何进行图像识别与人脸对比 随着人工智能的发展&#xff0c;图像识别和人脸识别技术已经被广泛应用于各种应用程序中。Vue作为一种流行的前端框架&#xff0c;提供了许多实用工具和库&#xff0c;可以帮助我们在应用程序中进行图像识别和人脸识别。在本文中&#xff0c;…

docker换源(docker镜像源)pull超时(pull镜像超时)/etc/docker/daemon.json

文章目录 pull了n次都超时&#xff0c;也是醉了更换镜像源步骤1. 打开终端并以管理员身份登录到Docker主机。2. 编辑Docker配置文件daemon.json。该文件用于配置Docker守护进程的参数。3. 在daemon.json文件中添加以下内容&#xff0c;将<镜像源地址>替换为您选择的镜像源…

基于matlab仿真具有不同传感器模式的锥形阵列(附源码)

一、前言 此示例说明如何在不同的阵列配置上应用锥形和模型细化。它还演示了如何创建具有不同元素模式的数组。 二、ULA 逐渐变细 本节介绍如何在均匀线性阵列 &#xff08;ULA&#xff09; 的元素上应用泰勒窗口以降低旁瓣电平。 比较锥形阵列和非锥形阵列的响应。请注意锥形U…

外部局域网直接访问WSL2

1. 开启hyper-v 1、首先&#xff0c;进入控制面板—程序—启用或关闭windows功能&#xff0c;勾选hyper-v&#xff0c;确认后重启电脑。2、打开 Windows PowerShell&#xff0c;输入 systeminfo 命令 能够看到出现了很多处理器的信息&#xff0c;最末尾有个 Hyper-V 要求&…

Redis 2023面试5题(一)

一、Redis是单线程还是多线程 在面试中&#xff0c;当被问到Redis是单线程还是多线程这个问题时&#xff0c;可以按照以下思路进行回答&#xff1a; 首先&#xff0c;Redis的核心业务部分是单线程的&#xff0c;即命令处理部分是单线程的。然而&#xff0c;Redis也支持多路复…

Java---第四章(数组基础,冒泡排序,二分查找,多维数组)

Java---第四章 一 数组基本知识数组操作 二 数组实操数组排序二分查找二维数组 一 数组 基本知识 概念&#xff1a; 数组是编程语言中的一种常见的数据结构&#xff0c;能够存储一组相同类型的数据 作用&#xff1a; 存储一组相同类型的数据&#xff0c;方便进行数理统计&am…

springboot3生命周期监听的使用和源码解析

定义SpringApplicationRunListener来监听springApplication的启动 1.通过实现springApplicationRunListener来实现监听。 2.在 META-INF/spring.factories 中配置 org.springframework.boot.SpringApplicationRunListener自己的Listener。 在默认的springboot配置中就有给我…

视觉SLAM十四讲——ch12实践(建图)

视觉SLAM十四讲——ch12的实践操作及避坑 0.实践前小知识介绍1. 实践操作前的准备工作2. 实践过程2.1 单目稠密重建2.2 RGB-D稠密建图2.3 点云地图2.4 从点云重建网格2.5 八叉树地图 3. 遇到的问题及解决办法3.1 cmake ..时&#xff0c;出现opencv版本问题3.2 make -j8时&#…

使用腾讯云服务器从零搭建个人网站

前期准备工作 1.服务器重装系统 选择ubuntu18的系统镜像 2.开放端口 需要开放80&#xff0c;27017&#xff0c;3000&#xff0c;22端口 80端口用于配置nginx服务27017端口用于连接mongondb数据库3000端口是启动项目的端口22端口用于ssh远程连接服务器&#xff0c;一般默认会…

SpringBoot - @Transactional注解详解

简介 Spring中的Transactional注解&#xff0c;基于动态代理的机制&#xff0c;提供了一种透明的事务管理机制&#xff0c;方便快捷的解决在开发中碰到的问题&#xff0c;Transactional 的事务开启 &#xff0c;或者是基于接口的或者是基于类的代理被创建。Spring为了更好的支…

数据库SQL查询(二)之连接查询

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…

python django vue httprunner 实现接口自动化平台(最终版)

一、项目介绍&#xff1a; 1.1 项目地址 前端地址&#xff1a; GitHub - 18713341733/test_platform_service: django vue 实现接口自动化平台 后端地址&#xff1a; GitHub - 18713341733/test_platform_front: Django vue实现接口自动化平台 1.2 项目介绍 1.2.1 环境…

在 K8S 中部署一个应用 上

本身在 K8S 中部署一个应用是需要写 yaml 文件的&#xff0c;我们这次简单部署&#xff0c;通过拉取网络上的镜像来部署应用&#xff0c;会用图解的方式来分享一下&#xff0c;过程中都发生了什么 简单部署一个程序 我们可以通过 kubectl run 的方式来简单部署一个应用&#…