Go 语言 for 的用法

news2025/1/19 2:35:21

For statements

本文简单翻译了 Go 语言中 for 的三种用法,可快速学习 Go 语言 for 的使用方法,希望本文能为你解开一些关于 for 的疑惑。详细内容可见文档 For statements。

For statements with single condition

在最简单的形式中,只要 for 语句布尔条件结果为真,就重复执行代码块。在每次迭代之前都会评估该条件。如果条件不存在,则相当于布尔值 true。

for a < b {
	a *= 2
}

// 永远为真
for { }

For statements with for clause

带有 ForClause 的 for 语句也受其条件控制,但此外它还可以指定一个 init 和一个 post 语句,例如一个赋值语句、一个递增或递减语句。init 语句可以是一个短变量声明,但 post 语句不行。init 语句声明的变量的作用域在 for 代码块内部。

for i := 0; i < 10; i++ {
	f(i)
}

// 不能在外面使用变量 i

如果 init 语句不为空,则在第一次评估迭代条件前执行一次;post 语句在每次执行代码块后执行。ForClause 的任何元素都可以为空,但除非只有一个条件,否则分号不能省略。如果条件不存在,则相当于布尔值 true。

这种形式的 for 语句与 C++ 的 for 循环很相似。但有一点要注意的是,它只能有一个 post 语句,并且在 Go 中递增和递减是语句,这意味着我们不能在 post 语句中写出 i++, j-- 这样的代码。

例如,我们想验证一个字符串是否是回文串,用 C++ 可以这样写:

bool judge(string str) {
    for (int i = 0, j = str.size()-1; i < j; i++, j--) {
        if (str[i] != str[j]) {
            return false;
        }
    }
    return true;
}

在 Go 中,我们需要写成如下形式:

func judge(str string) bool {
    for i, j := 0, len(str)-1; i < j; {
        if str[i] != str[j] {
            return false
        }
        i++
        j--
    }
    return true
}

For statements with range clause

带有 range 子句的 for 语句会遍历数组、切片、字符串或 map 的所有条目,或者从 channel 接收的值。对于每个条目,它会将迭代值分配给相应的迭代变量(如果存在),然后执行代码块。

RangeClause = [ ExpressionList "=" | IdentifierList ":=" ] "range" Expression .

range 子句中右边的表达式称为范围表达式,其类型必须是数组、数组指针、切片、字符串、map 或允许接收操作的 channel。与赋值类似,左侧的操作数必须可寻址的或 map 索引表达式;它们表示迭代变量。如果范围表达式是 channel,则最多允许一个迭代变量,否则最多允许两个。

左侧的函数调用每次迭代都会计算一次。对于迭代,如果存在相应的迭代变量,则按如下方式生成迭代值:

范围表达式                            第一个值及类型   第二个值及类型

array or slice  a [n]E, *[n]E or []E index    int    a[i]       E
string          s string type        index    int    见下文      rune
map             m map[K]V            key      K      m[k]       V
channel         c chan E, <-chan E   element  E
  1. 对于数组、数组指针或切片值 a,索引迭代值从 0 开始按递增顺序生成。如果只有一个迭代变量,则只会生成从 0 到 len(a)-1 的整数值,并不会索引到数组或切片本身
  2. 对于字符串值,range 子句从 0 开始迭代字符串中的 Unicode 码点。在连续的迭代中,索引值将是字符串中连续 UTF-8-encoded 码点的第一个字节的索引;而第二个值,类型为 rune,是相应码点的值

UTF8 解码

  1. map 的迭代顺序未指定(底层实现是哈希表),并且不保证两次迭代的顺序相同
  2. 对于 channel,产生的迭代值是 channel 发送的连续值,直到 channel 关闭

迭代值被分配给各自的迭代变量,如赋值语句中一样。迭代变量可以通过 range 子句使用短变量声明(:=)的形式来声明。

需要注意的是对 string 的遍历,它并不是一个字节一个字节遍历的,它是以 Unicode 码点为单位遍历的。string 使用 UTF8 编码,使用 1 到 4 个字节来表示每个 Unicode 码点,ASCII 部分字符只使用 1 个字节,常用字符部分使用 2 或 3 个字节表示。

上面图片可以看到中文占了三个字节,图片出处为《Go 程序设计语言》第三章。

str := "Hello, 世界"
for i, r := range str {
    fmt.Printf("%d\t%q\n", i, r)
}

var key string
var val int
m := map[string]int{"mon": 0, "tue": 1, "wed": 2, "thu": 3, "fri": 4, "sat": 5, "sun": 6}
for key, val = range m {
    fmt.Println(key, " : ", val)
}

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

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

相关文章

Redis -- 渐进式遍历

家&#xff0c;是心的方向。不论走多远&#xff0c;总有一盏灯为你留着。桌上的碗筷多了几双&#xff0c;笑声也多了几分温暖。家人团聚&#xff0c;是最美的风景线。时间&#xff1a;2024年 2月 8日 12:51:20 目录 前言 语法 示例 前言 试想一个场景,那就是在key非常多的…

【数据结构与算法-初学者指南】【附带力扣原题】队列

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

【项目问题解决】java. net.SocketException: Connection reset

目录 【项目问题解决】java. net.SocketException: Connection reset 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 通过JMeter 压测接口&#xff0c;无并发&#xff0c;无间歇时间跑接口10000次报错&#xff0c;后续改成建个…

云卷云舒:论超级数据库、算网数据库、智算数据库

笔者大胆提出一种“超级数据库”的概念设想。 一、超级能力 就像当初提出“超级计算机”一样&#xff0c;我们是否同样可以提出“超级数据库”的概念呢&#xff1f;当然不是不可以。 二、超级计算机 我们回忆一下“超级计算机”的发展之路&#xff0c;大致经过了如下几个环…

Swift Combine 管道 从入门到精通三

Combine 系列 Swift Combine 从入门到精通一Swift Combine 发布者订阅者操作者 从入门到精通二 1. 用弹珠图描述管道 函数响应式编程的管道可能难以理解。 发布者生成和发送数据&#xff0c;操作符对该数据做出响应并有可能更改它&#xff0c;订阅者请求并接收这些数据。 这…

FPGA实现ISP用于无人车、无人机配送的方案调研

查到一个always 奥唯思公司做的用FPGA实现ISP的方案&#xff0c;采用易灵思钛金16nm的FPGA Ti60F225&#xff0c;通过MIPI CSI RX采集图像传感器的数据&#xff0c;在FPGA内部经过一系列复杂的ISP运算后&#xff0c;再通过MIPI CSI TX将图像数据发送给后端。 一套完整的ISP&a…

【前端】实现Vue组件页面跳转的多种方式

目录 前言1. 内嵌2. 跳转新页面2.1 Demo12.2 Demo22.3 Demo3 3. 拓展 前言 通过某个Button让页面多种方式跳转 1. 内嵌 想要在Vue应用中内嵌一个外部网页&#xff0c;可以使用<iframe>标签 下面是一个示例&#xff1a; <template><div><!-- 在这里嵌入…

C语言一招教你搞定所有基础函数知识(上)

1.前言 Hello&#xff0c;大家好&#xff0c;我是小陈&#xff0c;新年快乐呀&#xff01;马上就龙年了&#xff0c;今天是大年30&#xff0c;祝各位新的一年更上一层楼&#xff0c;今天小陈为大家带来了C语言的函数基础知识&#xff0c;希望大家仔细看完。 2.函数的概念 何…

数据库切片大对决:ShardingSphere与Mycat技术解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 数据库切片大对决&#xff1a;ShardingSphere与Mycat技术解析 前言ShardingSphere与Mycat简介工作原理对比功能特性对比 前言 在数据库的舞台上&#xff0c;有两位颇受欢迎的明星&#xff0c;它们分别…

Unity入门学习

目录 Unity环境搭建Unity引擎是什么软件下载和安装工程文件夹 Unity界面基础Scene场景和Hierarchy层级窗口Game游戏和Project工程Inspector和Console工具栏和父子关系 Unity工作原理反射机制和游戏场景预设体和资源包的导入导出 Unity脚本基础脚本基本规则生命周期函数Inspecto…

Aethir和Well-Link Tech携手革新云游戏,释放人工智能(AI)潜力

​Aethir将为Well-Link Tech的2亿用户提供先进的GPU计算能力&#xff0c;大幅提升他们的游戏体验。 新加坡&#xff0c;2024年2月7日 - 先驱性的去中心化GPU网络Aethir与实时云渲染技术领导者Well-Link Tech携手共创云游戏和元宇宙发展的新时代。 借助Well-Link Tech对领先游戏…

算法---回溯(正文)

1.什么是回溯&#xff1f; 回溯算法的定义就是和暴力枚举一样枚举所有可能并加撤回&#xff0c;也能和暴力一样去掉一些重复&#xff08;在之前就被筛出&#xff0c;但还要枚举这个&#xff0c;我们可以跳过这个了---------这个就是回溯剪枝&#xff09;。但为什么回溯不是暴力…

分享90个行业PPT,总有一款适合您

分享90个行业PPT&#xff0c;总有一款适合您 90个行业PPT下载链接&#xff1a;https://pan.baidu.com/s/1bHvhk_42-IFAjNdjPPtMZw?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

【蓝桥杯冲冲冲】Prime Gift

【蓝桥杯冲冲冲】Prime Gift 蓝桥杯备赛 | 洛谷做题打卡day31 文章目录 蓝桥杯备赛 | 洛谷做题打卡day31Prime Gift题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示题解代码我的一些话 Prime Gift 题面翻译 给你 n n n 个…

自适应二次元404页面源码

自适应二次元404页面源码&#xff0c;HTMLCSSJS,喜欢二次元的朋友可以下载使用 蓝奏云&#xff1a;https://wfr.lanzout.com/iuPNQ1ns7dxg

Linux网络编程——udp套接字

本章Gitee地址&#xff1a;udp套接字 文章目录 创建套接字绑定端口号读取数据发送数据聊天框输入框 创建套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol);int domain参数&#xff1a;表面要创建套接字的域…

ElasticSearch之倒排索引

写在前面 本文看下es的倒排索引相关内容。 1&#xff1a;正排索引和倒排索引 正排索引就是通过文档id找文档内容&#xff0c;而倒排索引就是通过文档内容找文档id&#xff0c;如下图&#xff1a; 2&#xff1a;倒排索引原理 假定我们有如下的数据&#xff1a; 为了建立倒…

Day7.

使用QT编写一个简单QQ登录界面 widget.c #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon(":/pictrue/qq.png"));ui-&…

github使用问题汇总

1. Permission denied 1.1. 问题描述 Permission denied (publickey). fatal: Could not read from remote repository. 1.2. 解决方法 生成公钥 ssh-keygen -t ed25519 -C "your_emailexample.com" 点击回车三次 Generating public/private ed25519 key pair. …

从RSA角度出发解析JWT原理

文章目录 一、JWT介绍1. JWT组成部分2. 头部&#xff08;Header&#xff09;3. 载荷&#xff08;Payload&#xff09;4. 签名&#xff08;Signature&#xff09; 二、深入理解JWT签名验证1. 签名生成2. 签名验证3. 为什么JWT是安全的 三、如何验证JWT是否有效四、 Why JWT&…