当前位置: 首页 > news >正文

【go从入门到精通】for循环控制

作者简介:

        高科,先后在 IBM PlatformComputing从事网格计算,淘米网,网易从事游戏服务器开发,拥有丰富的C++,go等语言开发经验,mysql,mongo,redis等数据库,设计模式和网络库开发经验,对战棋类,回合制,moba类页游,手游有丰富的架构设计和开发经验。 (谢谢你的关注)

--------------------------------------------------------------------------------------------------------------------------------

前言        

         Go 语言提供了 for 循环语句,用于重复执行一段程序逻辑,直到循环条件不再满足时终止。

          循环可以用于迭代各种数据结构(例如切片、数组、映射或字符串)中的元素

        本文将很基础的for循环语法,循环嵌套,无限循环,goto,break,continue呈现给正在学习go开发的读者。         

for

语法

Go语言的for循环有3中形式,只有其中的一种使用分号。

    for init; condition; post { }
    for condition { }
    for { }

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


for语句执行过程如下:
    ①先对表达式 init 赋初值;
    ②判别赋值表达式 init 是否满足给定 condition 条件,若其值为真,满足循环条件,则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。   

s := "abc"for i, n := 0, len(s); i < n; i++ { // 常见的 for 循环,支持初始化语句。println(s[i])
}n := len(s)
for n > 0 {                // 替代 while (n > 0) {}n-- println(s[n])        // 替代 for (; n > 0;) {}
}for {                    // 替代 while (true) {}println(s)            // 替代 for (;;) {}
}  

不要期望编译器能理解你的想法,在初始化语句中计算出全部结果是个好主意。

package mainfunc length(s string) int {println("call length.")return len(s)
}func main() {s := "abcd"for i, n := 0, length(s); i < n; i++ {     // 避免多次调用 length 函数。println(i, s[i])} 
}  

输出:

    call length.
    0 97
    1 98
    2 99
    3 100 

for-range

range类似迭代器操作,返回 (索引, 值) 或 (键, 值)。

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

for key, value := range oldMap {newMap[key] = value
}   
1st value2nd value
stringindexs[index]unicode, rune
array/sliceindexs[index]
mapkeym[key]
channelelement

可忽略不想要的返回值,或 "_" 这个特殊变量。

1. 迭代字符串

for-range循环可用于访问字符串中的各个字符。

package main
import "fmt"func main() {for i, ch := range "World" {fmt.Printf("%#U starts at byte position %d\n", ch, i)}
}

以上实例运行输出结果为:

U+0057 'W' starts at byte position 0
U+006F 'o' starts at byte position 1
U+0072 'r' starts at byte position 2
U+006C 'l' starts at byte position 3
U+0064 'd' starts at byte position 4

2. 迭代map

for-range循环可用于访问映射中的各个键值对。

package main
import "fmt"func main() {m := map[string]int{"one":   1,"two":   2,"three": 3,}for key, value := range m {fmt.Println(key, value)}
}

输出结果:

one 1 
two 2 
three 3 

3. 迭代通道

对于通道,迭代值是在通道关闭之前在通道上发送的连续值。

package main
import "fmt"func main() {mychannel := make(chan int)go func() {mychannel <- 1mychannel <- 2mychannel <- 3close(mychannel)}()for n := range mychannel {fmt.Println(n)}
}

输出:

1
2
3

循环嵌套

在 for 循环中嵌套一个或多个 for 循环

语法

以下为 Go 语言嵌套循环的格式:

for [condition |  ( init; condition; increment ) | Range]
{for [condition |  ( init; condition; increment ) | Range]{statement(s)}statement(s)
}  

实例:

下面这个例子使用了两个 for 循环来实现循环嵌套。外层的循环变量为 i,范围是 1 到 3,内层的循环变量为 j,范围也是 1 到 3。

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

最终的输出结果为::

i: 1, j: 1
i: 1, j: 2
i: 1, j: 3
i: 2, j: 1
i: 2, j: 2
i: 2, j: 3
i: 3, j: 1
i: 3, j: 2
i: 3, j: 3

无限循环

如过循环中条件语句永远不为 false 则会进行无限循环,我们可以通过 for 循环语句中只设置一个条件表达式来执行无限循环:

package mainimport "fmt"func main() {for true  {fmt.Printf("这是无限循环。\n");}
}  

细心的读者可能已经发现了实际上for true {} 和for {}是等价的,所以这两种方式都可以,只不过在阅读代码的时候你需要知道这种方式。 

goto、break、continue

如果你有其他语言的开发基础,我i想你对这三个关键词很熟悉, 同样的在Go中,goto、break和continue也是三种控制流语句,用于改变程序的执行顺序

goto语句:

  • 语法:goto label
  • 作用:无条件跳转到指定的标签处执行,可以跳转到同一个函数或代码块内的任意位置。
  • 注意事项:goto语句应该慎用,因为滥用goto会导致代码难以理解和维护。

示例代码:

func main() {i := 0
Loop:if i < 5 {fmt.Println(i)i++goto Loop}
}

break语句:

  • 语法:break
  • 作用:跳出循环体或switch语句,结束当前循环或switch语句的执行,继续执行循环或switch之后的代码。
  • 注意事项:break语句只能用于循环体或switch语句的内部,不可用于其他地方。

示例代码:

func main() {for i := 0; i < 10; i++ {if i == 5 {break}fmt.Println(i)}
}

continue语句:

  • 语法:continue
  • 作用:终止当前迭代,跳过本次循环中continue语句之后的代码,开始下一次迭代。
  • 注意事项:continue语句只能用于循环体内部,不可用于其他地方。

示例代码:

func main() {for i := 0; i < 5; i++ {if i == 2 {continue}fmt.Println(i)}
}
  • goto语句用于无条件跳转到指定位置执行,慎用。
  • break语句用于结束当前循环或switch语句的执行,继续执行之后的代码。
  • continue语句用于跳过本次循环的剩余代码,开始下一次迭代。

相关文章:

【go从入门到精通】for循环控制

作者简介&#xff1a; 高科&#xff0c;先后在 IBM PlatformComputing从事网格计算&#xff0c;淘米网&#xff0c;网易从事游戏服务器开发&#xff0c;拥有丰富的C&#xff0c;go等语言开发经验&#xff0c;mysql&#xff0c;mongo&#xff0c;redis等数据库&#xff0c;设计模…...

<chrono>, clock_gettime(), gettimeofday()对比

精度&#xff08;Precision&#xff09;&#xff1a; <chrono>: 提供了纳秒级别的精度&#xff0c;可以满足大多数应用的需求。clock_gettime(): 提供了纳秒级别的精度&#xff0c;与 <chrono> 相当。gettimeofday(): 提供了微秒级别的精度&#xff0c;相对于前两者…...

基于 YAML 接口自动化测试框架设计

在设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML、CSV&#xff09;&#xff0c;或者数据库中&#xff0c;实现脚本与数据解耦&#xff0c;方便后期维护。目前非常多的自动化测试框架采用通过Excel或者YAML文件直接编写测…...

团体程序设计天梯赛 L2-031 深入虎穴

L2-3深入虎穴 分数 25 名的王牌间谍 007 需要执行一次任务&#xff0c;获取敌方的机密情报。已知情报藏在一个地下迷宫里&#xff0c;迷宫只有一个入口&#xff0c;里面有很多条通路&#xff0c;每条路通向一扇门。每一扇门背后或者是一个房间&#xff0c;或者又有很多条路&a…...

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时&#xff0c;HouseHolder变换…...

学习使用xbox手柄控制小乌龟节点移动

使用xbox手柄控制小乌龟&#xff0c;首先要下载joy功能包&#xff0c;发布sensor_msgs话题也就是手柄和ros通信的话题。 下载的步骤就根据官方文档即可 joy/Tutorials/ConfiguringALinuxJoystick - ROS Wiki 这里我提供一下具体步骤 第一步 安装joy 首先安装对应系统版本的…...

OpenLayers6实战,OpenLayers绘制特殊图形,OpenLayers绘制四角形(菱形),OpenLayers绘制菱形

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解如何使用OpenLayers6实现绘制特殊图形,以绘制四角形(菱形),OpenLayers绘制菱形的功能为例。 本章核心代码不依赖任何第三方插件,只依赖OpenLayers。 需要注意的是两个操作按钮需要引入ElementUI 二、依赖和使用 &q…...

虚拟机如何在原有磁盘上扩容

虚拟机未开启状态–菜单栏–虚拟机–快照–拍摄快照–拍摄快照– 菜单栏–虚拟机–快照–快照管理器–点击刚刚的快照1–删除–是– 文件–新建或者打开–硬盘&#xff08;以本人Win 10.64.3GL为例&#xff09;–虚拟机设置–硬件– 硬盘&#xff08;SATA&#xff09;–磁盘实…...

2024-03-27 作业

作业要求&#xff1a; 整理课上代码整理思维导图完成下面类 作业1&#xff1a; 完成了 作业2&#xff1a; 作业3&#xff1a; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():si…...

C语言二叉树和堆(个人笔记)

二叉树和堆 二叉树1二叉树的概念和结构1.1特殊的二叉树1.2二叉树的性质&#xff08;规定根节点的层数为1&#xff09;1.3二叉树的存储结构 2.二叉树的顺序结构和实现2.1二叉树的顺序结构2.2堆的概念和结构2.3堆的实现2.4堆的应用2.4.1堆排序 2.5TOP-K问题 3.二叉树的遍历4.二叉…...

重学SpringBoot3-Profiles介绍

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞&#x1f44d;收藏⭐评论✍ 重学SpringBoot3-Profiles介绍 Profiles简介如何在Spring Boot中使用Profiles定义Profiles激活ProfilesIDEA设置active profile使用Profile-specific配置文件 条件化Bean…...

Transformer 论文阅读笔记

文章目录 前言论文阅读研究现状工作内容模型架构训练过程实验结果模型代码 其他评价 前言 Transformer可以说是深度学习领域最重要的&#xff0c;里程碑式的工作之一&#xff0c;发表于2017年的NIPS。该模型开创了自MLP&#xff08;多层感知机&#xff09;、CNN&#xff08;卷…...

Vue 3中ref和reactive的区别

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

oracle19c adg搭建

一、环境搭建 主机IPora19192.168.232.111ora19std192.168.232.112 本文结合&#xff1a;https://blog.csdn.net/weixin_63131036/article/details/136635553 1.配置网络yum源 1.删除redhat7.0系统自带的yum软件包&#xff1b; rpm -qa|grep yum >oldyum.pkg 备份原信息 …...

关闭Elasticsearch built-in security features are not enabled

禁用Kibana安全提示&#xff08;Elasticsearch built-in security features are not enabled&#xff09; Kibana提示#! Elasticsearch built-in security features are not enabled. Without authentication, your cluster could be accessible to anyone. See https://www.e…...

MC0248 密码判断器(判断强弱密码)

原题链接<---- islower 小写字母判断 isupper 大写字母判断 isdigit 数字判断 题目: 小码哥在是一位密码领域的初学者&#xff0c;有一天他的老师给他了一串密码&#xff0c;要他判断这个密码是否是强密码&#xff0c;老师和他说强密码就是需要同时达到以下要求&#xff1…...

vue3+threejs新手从零开发卡牌游戏(十六):初始化对方手牌

添加对方手牌区时注意位置调整&#xff0c;以及手牌应该是背面朝上&#xff0c;加个rotateX翻转即可&#xff0c;其他代码和p1.vue代码一致&#xff0c;game/hand/p2.vue代码如下&#xff1a; <template><div></div> </template><script setup lan…...

网页无插件视频播放器,支持录像、截图、音视频播放,多路播放等,提供源码下载

前言 本播放器内部采用jessibuca插件接口&#xff0c;支持录像、截图、音视频播放等功能。播放器播放基于ws流&#xff0c;分屏操作支持1分屏、4分屏、6分屏、9分屏方式。 jessibuca工作原理是通过Emscripten将音视频解码库编译成Js&#xff08;WebAssembly&#xff0c;简称was…...

Openstack创建和操作实例,实现与外部网络通信

一、熟悉OpenStack图形界面操作 1、了解Horizon项目 Horizon项目 各OpenStack服务的图形界面都是由Horizon提供的。Horizon提供基于Web的模块化用户界面。Horizon为云管理员提供一个整体的视图。Horizon为终端用户提供一个自主服务的门户。Horizon由云管理员进行管理与控制&a…...

dubbo 源码系列之-集群三板斧---负载均衡(二)

在上一课时我们了解了 LoadBalance 接口定义以及 AbstractLoadBalance 抽象类的内容&#xff0c;还详细介绍了 ConsistentHashLoadBalance 以及 RandomLoadBalance 这两个实现类的核心原理和大致实现。本课时我们将继续介绍 LoadBalance 的剩余三个实现。 LeastActiveLoadBala…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...