Go 知识for-range

Go 知识for-range

  • 1. for-range 的用法
    • 1.1 数组
    • 1.2 切片
    • 1.3 字符串
    • 1.4 map
    • 1.5 chan
  • 2. 原理
    • 2.1 数组
    • 2.2 切片
    • 2.3 字符串
    • 2.4 map
    • 2.5 chan
  • 3. 总结

https://a18792721831.github.io/

1. for-range 的用法

for-range 表达式用于遍历集合元素,比传统的for更加简单直观。
for-range 的表达式一般格式:

    for index, value := range data {
        //....
    }

for-range 一般可以返回两个值,对于不同类型的data有不同的返回值。
对于数组,返回下标和值。
对于切片,返回下标和值。
对于string,返回下标和值。
对于map,返回key和value。
对于chan,返回值,只会返回一个元素。

1.1 数组

	arr := [5]int{1, 2, 3, 4, 5}
	for i := range arr {
		fmt.Println(arr[i])
	}
	fmt.Println()
	for i, v := range arr {
		fmt.Printf("i=%d,v=%d\n", i, v)
	}

在这里插入图片描述

1.2 切片

	arr := []int{1, 2, 3, 4, 5}
	for i := range arr {
		fmt.Println(arr[i])
	}
	fmt.Println()
	arr = append(arr, 6, 7, 8, 9)
	for i, v := range arr {
		fmt.Printf("i=%d,v=%d\n", i, v)
	}

在这里插入图片描述

1.3 字符串

	str := "hello world"
	for i := range str {
		fmt.Println(str[i])
	}
	fmt.Println()
	for i, v := range str {
		fmt.Printf("i=%d,v=%c\n", i, v)
	}

在这里插入图片描述

需要注意的是,对于中英文,因为编码的方式不同,每个字符的占用空间不同,就会出现下标不连续的问题。

	str := "你好,世界"
	for i := range str {
		fmt.Println(str[i])
	}
	fmt.Println()
	for i, v := range str {
		fmt.Printf("i=%d,v=%c\n", i, v)
	}

在这里插入图片描述

1.4 map

	str := map[string]int{
		"one":   1,
		"two":   2,
		"three": 3,
		"four":  4,
		"five":  5,
	}
	for i := range str {
		fmt.Println(str[i])
	}
	fmt.Println()
	for k, v := range str {
		fmt.Printf("i=%s,v=%d\n", k, v)
	}

在这里插入图片描述

1.5 chan

	ch := make(chan string, 10)
	ch <- "h"
	ch <- "e"
	ch <- "l"
	ch <- "l"
	ch <- "o"
	for i := range ch {
		fmt.Println(i)
	}
	//fmt.Println()
	//for k, v := range ch {
	//	fmt.Printf("i=%s,v=%d\n", k, v)
	//}

在这里插入图片描述

因为chan里面没有数据了,所以就阻塞了,并不会自动结束哦。
当你视图用两个变量接收返回值的时候,就会编译失败
在这里插入图片描述

2. 原理

for-range是在编译的时候,转换为传统的for语句。
需要注意,下面都是伪代码,使用常见的语法规则进行描述。

因为在for-range中使用了 := 短定义并赋值的方式,所以使用for-range的时候,第二个值会进行变量拷贝,对于大数据的for-range,可能会导致性能变差。

2.1 数组

    len_temp := len(arr)
    data := arr
    for index_temp = 0; index_temp < len_temp; index_temp++ {
        value_temp = data[index_temp]
        index = index_temp
        value = value_temp
        // 执行 for-range 里面的代码
        // .....
    }

需要注意的一个,在数组中,len和cap是两个值,如果len=5,cap=10,在遍历过程中,对于第6个元素进行赋值,那么是无法遍历到的。因为在遍历开始的时候,就已经使用len获取到了遍历范围了。

2.2 切片

    len_temp := len(sli)
    data := sli
    for index_temp = 0; index_temp < len_temp; index_temp++ {
        value_temp = data[index_temp]
        index = index_temp
        value = value_temp
        // 执行 for-range 里面的代码
        // .....
    }

切片与数组基本上相同。

2.3 字符串

    len_temp := len(str)
    var next_index_temp int
    for index_temp = 0; index_temp < len_temp; index_temp = nex_index_temp {
        value_temp = rune(str[index_temp])
        if value_temp < utf8.RuneSize {
            next_index_temp = index_temp + 1
        } else {
            value_temp, next_index_temp = decoderune(str, index_temp)
        }
        index = index_temp
        value = value_temp
        // 执行 for-range 里面的代码
        // .....
    }

因为不同的字符集,占用的长度不同,所以这里会对是否是utf8字符集字符进行判断,并进行不同的处理。
比如:
在这里插入图片描述

2.4 map

    var temp *map
    init_map(type, data, &temp)
    for ; temp != nil; temp = iter_next() {
        index_temp = *temp.key
        value_temp = *temp.value
        index = index_temp
        value = value_temp
        // 执行 for-range 里面的代码
        // .....
    } 

map的遍历是无序的,同时不会指定次数,但是同样需要避免在遍历过程中,操作map。

2.5 chan

    for {
        index_temp, ok = <- ch
        if !ok {
            break
        }
        index = index_temp
        // 执行 for-range 里面的代码
        // .....
    }

可以看到遍历chan,最终依然是使用操作符<-读取数据的,但是会对第二个值进行判断,所以可以保证for-range返回的值都是成功读取的值,当没有数据读取的时候,依然会因为操作符<-阻塞。

3. 总结

总的来说,for-range和java里面的for-each是类似的,原理都可以理解为语法糖,在编译的时候再进行替换。

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

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

相关文章

【微信小程序】15分钟倒计时(附带天数和时钟的实现方法在文章中)

这是制作的订单支付前倒计时&#xff0c;如果客户在规定时间内没能 支付&#xff0c;则系统自动删除&#xff0c;这样就以便有些商品冗余&#xff0c;当然了&#xff0c;这里只有分钟和秒钟&#xff0c;天数和时钟我写在了最底下&#xff0c;最后代码的显示第七行&#xff0c;可…

C++:引用

目录 概念&#xff1a; 引用的使用格式&#xff1a; 引用特性&#xff1a; 常引用 使用场景&#xff1a; 1、做参数 二级指针时的取别名 一级指针取别名 一般函数取别名 2、做返回值 函数返回值的原理&#xff1a; 引用的返回值使用&#xff1a; 引用和指针的对比&…

搭建AI问答和AI绘画小程序都需要做什么?

1、注册和认证小程序 在微信公众平台 注册&#xff0c;选择小程序类别即可。根据提示提交企业相关资质文件即可&#xff0c;注册后进行认证小程序&#xff0c;官方会收取300元认证费用。也可以私信我可以免掉300元认证费。 2、开通微信商家支付 认证通过后&#xff0c;在“功…

uniapp 使用echarts做折线图条形图。

提前10天把中烟活动做完了&#xff0c;以为能打酱油到除夕那天&#xff0c;结果又要做什么数据看板&#xff0c;方便烟草领导过年查看数据&#xff0c;还只给5天时间&#xff0c;真实压榨剥削啊&#xff0c;下辈子再也不‘拍黄片’了&#xff0c;不&#xff01;下份工作我就转前…

MySQL:函数

基本介绍 在MySQL中&#xff0c;为了提高代码重用性和隐藏实现细节&#xff0c;MySQL提供了很多函数。函数可以理解为别人封装好的模板代码。 在MySQL中&#xff0c;函数非常多&#xff0c;主要可以分为五类&#xff1a;聚合函数、数学函数、字符串函数、日期函数、控制流函数、…

Maven讲解

介绍 Maven是一个流行的构建工具和项目管理工具&#xff0c;它主要用于Java项目的构建、依赖管理和项目报告生成。Maven通过提供一致的项目结构、自动化的构建过程和强大的依赖管理&#xff0c;简化了项目的开发和维护过程。 下面是一些Maven的主要特点和用途&#xff1a; 项…

【算法】Knuth-Morris-Pratt 算法(KMP算法):一种在字符串中查找子串的算法

引言 KMP&#xff08;Knuth-Morris-Pratt&#xff09;算法是一个在字符串中查找子串的算法&#xff0c;由 Donald Knuth、Vaughan Pratt 和 James H. Morris 共同发明。这个算法的特点是在查找过程中&#xff0c;不会回溯主串&#xff0c;也不会重复扫描已经比较过的子串&…

2024年上海高考数学最后四个多月的备考攻略,目标140+

亲爱的同学们&#xff0c;寒假已经来临&#xff0c;春节即将到来&#xff0c;距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼&#xff0c;也是拉分大户的数学科目&#xff0c;你准备好了吗&#xff1f;今天&#xff0c;六分成长为您分享上海高考数学最后四个多月的…

2024 高级前端面试题之 JS 「精选篇」

该内容主要整理关于 JS 的相关面试题&#xff0c;其他内容面试题请移步至 「最新最全的前端面试题集锦」 查看。 JS模块精选篇 1. 数据类型基础1.1 JS内置类型1.2 null和undefined区别1.3 null是对象吗&#xff1f;为什么&#xff1f;1.4 1.toString()为什么可以调用&#xff1…

燃烧的指针(三)

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;c语言从基础到进阶 &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于c语言的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x…

为什么需要使用线程池来创建线程?

当我们使用new Thread无限创建线程的时候 因为频繁的创建线程和销毁线程&#xff0c;cpu利用率会非常高 当cpu利用率达到100%的时候 那么没有可用的资源 让其他进程使用 那么其他进程访问就会导致卡顿 访问速度变慢 当我们使用线程池的时候 &#xff0c;cpu利用率就会降低&…

市场复盘总结 20240126

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 昨日主题投资 连板进级率 27/105 25.7% 二进三&#xff1a; 进级率低 50% 最常用的二种方法&#xff1a; 方…

2024最新版Visual Studio Code安装使用指南

2024最新版Visual Studio Code安装使用指南 Installation and Usage Guide for the Latest Visual Studio Code in 2024 By JacksonML Visual Studio Code最新版1.85已经于2023年11月由其官网 https://code.visualstudio.com正式发布&#xff0c;这是微软公司2024年发行的的最…

vs2019报错MSB4019 找不到导入的项目“BuildCustomizations\CUDA 9.2.props”

在VS中执行生成&#xff0c;报错如下&#xff1a;严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4019 找不到导入的项目“D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 9.2.props”。请确认 Import 声明“D:\Microso…

Mybatis----分页

1.什么是分页 分页&#xff08;Pagination&#xff09;是指将大量数据划分为多个页面进行展示的一种技术手段。在数据量较大的情况下&#xff0c;将所有数据一次性显示在页面上会导致加载时间过长和页面过于庞大&#xff0c;影响用户体验和系统性能。分页技术通过划分数据为多…

Mac Monitor:一款为macOS安全研究量身定制的高级独立系统监控工具

关于Mac Monitor Mac Monitor是一款功能强大的高级独立系统安全监控工具&#xff0c;该工具专为macOS安全研究、恶意软件分类和系统故障排除而设计&#xff0c;主要基于Apple Endpoint Security&#xff08;ES&#xff09;实现其功能。 Mac Monitor能够收集各种类型的系统事件…

量化交易学习2(因子研究)

因子有效性检验 参考1 参考2 在多因子研究框架中&#xff0c;因子的有效性检验是不可避免的工作&#xff0c;其本质是衡量一个因子的选股能力。 目前学术界和业界普遍使用的两种方法&#xff1a; 相关性检验 因子的相关性检验即检验单因子和收益率之间是否存在相关性 IC值 计…

搜狐新闻客户端使用Kotlin之后对JSON解析框架的探索

本文字数&#xff1a;7488字 预计阅读时间&#xff1a;45分钟 01 引言 自2017年Google发布Kotlin语言之后&#xff0c;Android开发由原来的Java开始向Kotlin过度&#xff0c;目前绝大部分Android开发岗位基本要求就是熟练使用Kotlin。事实上&#xff0c;很多有着多年历史的项目…

单片机学习笔记---矩阵键盘

目录 矩阵键盘的介绍 独立按键和矩阵按键的相同之处&#xff1a; 矩阵按键的扫描 代码演示 代码模块化移植 Keil自定义模板步骤&#xff1a; 代码编写 矩阵键盘就是开发板上右下角的这个模块 这一节的代码是基于上一节讲的LCD1602液晶显示屏驱动代码进行的 矩阵键盘的介…

主成分分析(PCA)Python

实际问题研究中&#xff0c;常常遇到多变量问题&#xff0c;变量越多&#xff0c;问题往往越复杂&#xff0c;且各个变量之间往往有联系。于是&#xff0c;我们想到能不能用较少的新变量代替原本较多的旧变量&#xff0c;且使这些较少的新变量尽可能多地保留原来变量所反映的信…