Go 语言 for 的用法

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.mfbz.cn/a/378026.html

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

相关文章

DFS——剪枝

dfs在每个点&#xff08;状态&#xff09;的情况比较多&#xff0c;但是节点比较少的时候很常用&#xff0c;我们将每个状态的情况延伸出去&#xff0c;可以画出一棵搜索树。dfs会搜到每一种情况&#xff0c;所以我们实际上可以按照任意顺序来判否。为了优化搜索我们可以在搜索…

Leetcode刷题笔记题解(C++):64. 最小路径和

思路一&#xff1a;dfs深度优先搜索&#xff0c;然后取最小路径值&#xff0c;但是时间消耗较大&#xff0c;时间复杂度可能不满足&#xff0c;代码如下&#xff1a; class Solution { public:int res 1000000;int rows,cols;int minPathSum(vector<vector<int>>…

C#中的浅度和深度复制(C#如何复制一个对象)

文章目录 浅度和深度复制浅度复制深度复制如何选择 浅度和深度复制 在C#中&#xff0c;浅度复制&#xff08;Shallow Copy&#xff09;和深度复制&#xff08;Deep Copy&#xff09;是两种不同的对象复制方式&#xff0c;满足不同的应用场景需求&#xff0c;它们主要区别在于处…

Vivado Tri-MAC IP的例化配置(三速以太网IP)

目录 1 Tri-MAC IP使用RGMII接口的例化配置1.1 Data Rate1.2 interface配置1.3 Shared Logic配置1.4 Features 2 配置完成IP例化视图 1 Tri-MAC IP使用RGMII接口的例化配置 在网络设计中&#xff0c;使用的IP核一般为三速以太网IP核&#xff0c;使用时在大多数场景下为配置为三…

IS-IS 接口认证密码平滑更换

拓扑图 配置 AR1、AR2建立ISIS level-2邻居关系&#xff0c;并配置接口认证密码为huawei sysname AR1 # isis 1is-level level-2network-entity 49.0000.0000.0000.0001.00 # interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0 isis enable 1isis authentica…

一文学会Axios的使用

异步请求 同步发送请求过程如下 浏览器页面在发送请求给服务器&#xff0c;在服务器处理请求的过程中&#xff0c;浏览器页面不能做其他的操作。只能等到服务器响应结束后才能&#xff0c;浏览器页面才能继续做其他的操作。 异步发送请求过程如下浏览器页面发送请求给服务器&…

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】

百卓Smart管理平台 uploadfile.php 文件上传漏洞【CVE-2024-0939】 一、 产品简介二、 漏洞概述三、 影响范围四、 复现环境五、 漏洞复现手动复现小龙验证Goby验证 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工…

基于YOLOv8的暗光低光环境下(ExDark数据集)检测,加入多种优化方式---自研CPMS注意力,效果优于CBAM ,助力自动驾驶(二)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了暗光低光数据集检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 自研CPMS注意力 mAP0.5由原始的0.682提升…

二十多篇文献带你读懂分布式学习与联邦学习优化思路 调度优化 压缩算法 聚合算法

前言 文中增加了引用跳转&#xff0c;如果想要细度哪一篇文章&#xff0c;只需通过引用跳转到结尾的Reference便可以获得文章的标题&#xff0c;通过Google Scholar搜索便可以获取原文。 本文为作者原创&#xff0c;转载请注明作者kaiserqzyue。 摘要 联邦学习的提出是为了…

前端ajax技术

ajax可以实现局部刷新&#xff0c;也叫做无刷新&#xff0c;无刷新指的是整个页面不刷新&#xff0c;只是局部刷新&#xff0c;ajax可以自己发送http请求&#xff0c;不用通过浏览器的地址栏&#xff0c;所以页面整体不会刷新&#xff0c;ajax获取到后台数据&#xff0c;更新页…

【51单片机】静态数码管显示(设计思路&原理&代码演示)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 本章节内容为【实现动静态数码管】项目的第二个模块完整章节&#xff1a;传送门 欢迎订阅 YY滴C专栏&#xff01;更多干货持…

L3HCTF 2024

Check in 输入一个1就获得flag

最大子数组和[中等]

一、题目 给定一个长度为n的环形整数数组nums&#xff0c;返回nums的非空 子数组 的最大可能和 。 环形数组 意味着数组的末端将会与开头相连呈环状。形式上&#xff0c;nums[i]的下一个元素是nums[(i 1) % n]&#xff0c;nums[i]的前一个元素是nums[(i - 1 n) % n]。 子数…

flutter开发实战-ijkplayer视频播放器功能

flutter开发实战-ijkplayer视频播放器功能 使用better_player播放器进行播放视频时候&#xff0c;在Android上会出现解码失败的问题&#xff0c;better_player使用的是video_player&#xff0c;video_player很多视频无法解码。最终采用ijkplayer播放器插件&#xff0c;在flutt…

PyTorch 2.2 中文官方教程(二)

在 YouTube 上介绍 PyTorch PyTorch 介绍 - YouTube 系列 原文&#xff1a;pytorch.org/tutorials/beginner/introyt.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 || 模型理解 作者&a…

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…

next项目页面性能调优

next项目页面性能调优 一般来说性能优化可以分为加载时、运行时两部分的优化。 扩展参考链接&#xff1a; 前端性能优化 24 条建议 Webpack 4进阶–从前的日色变得慢 &#xff0c;一下午只够打一次包 Webpack 分包优化首屏加载 参考指标 FCP&#xff08;First Contentful P…

fghbbbbbbbbbb

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 磁盘满的本质分析 专栏&#xff1a;《Linux从小白到大神》 | 系统学习Linux开发、VIM/GCC/GDB/Make工具…

双非本科准备秋招(19.2)—— 设计模式之保护式暂停

一、wait & notify wait能让线程进入waiting状态&#xff0c;这时候就需要比较一下和sleep的区别了。 sleep vs wait 1) sleep 是 Thread 方法&#xff0c;而 wait 是 Object 的方法 2) sleep 不需要强制和 synchronized 配合使用&#xff0c;但 wait 强制和 s…

初识C语言·预处理详解

目录 1 预定义符号 2 define定义常量 3 #define定义宏 4 带有副作用的宏 5 宏替换的规则 6 宏和函数的对比 7 # 和 ## i) #运算符 ii) ##运算符 8 命名约定 9 命令行定义 10 条件编译 条件编译1&#xff1a; 条件编译2&#xff1a; 条件编译3&#xff1a; 条件…
最新文章