使用range来循环切片时,每一轮都会向同一个临时变量进行赋值即赋值拷贝,这是一个性能上的开销。从下面的测试输出能看得出临时变量的地址是不会变的,而且与切片的地址完全不同。如果切片元素包含字符串的话,用range遍历和直接寻址遍历的性能差别还是很显著的。

package mainimport ("fmt""time"
)type Person struct {Name     stringGender   stringExperience string
}func main(){persons := make([]Person,8)persons[0] = Person{"David","Male","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[1] = Person{"Jenny","Female","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[2] = Person{"Tom","Male","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[3] = Person{"Lucy","Female","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[4] = Person{"David","Male","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[5] = Person{"Jenny","Female","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[6] = Person{"Tom","Male","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}persons[7] = Person{"Lucy","Female","This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!"}start := time.Now()for _,person := range persons{if person.Gender == "Male"{fmt.Printf("%p %v\n", &person, person)}}fmt.Printf("%v\n", time.Now().Sub(start))start = time.Now()for i:=0;i<len(persons);i++{if persons[i].Gender == "Male"{fmt.Printf("%p %v\n", &persons[i], persons[i])}}fmt.Printf("%v\n", time.Now().Sub(start))
}

输出:

0xc00009a000 {David Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc00009a000 {Tom Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc00009a000 {David Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc00009a000 {Tom Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
112.416µs
0xc000094180 {David Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc0000941e0 {Tom Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc000094240 {David Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
0xc0000942a0 {Tom Male This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!This is a long text!}
22.313µs

除了效率问题以外,for range这种把值拷贝给临时变量的机制,在操作切片元素地址的时候要特别小心,下面是一道面试题:

2 以下代码有什么问题,说明原因。
type student struct {
        Name string
        Age  int
}
func pase_student() {
        m := make(map[string]*student)
        stus := []student{
                {Name: "zhou", Age: 24},
                {Name: "li", Age: 23},
                {Name: "wang", Age: 22},
        }
        for _, stu := range stus {
                m[stu.Name] = &stu
        }
        fmt.Printf("%v\n",m)
}
for range这种循环写法在会创建一个临时变量,每轮循环都把元素值拷贝给该临时变量,所以&stu始终指向这个临时变量的地址,循环结束后m里的value将全部等于这个临时变量的地址,对应的取值等于切片的最后一个元素的取值。这种需要取地址的循环只能用直接寻址的写法:for i:=0;i<len(stus);i++{m[stus[i].name]=&stus[i]}

Go学习:切片slice的循环机制及性能相关推荐

  1. 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

  2. Flutter学习之事件循环机制、数据库、网络请求

    一.前言 学习了布局实例和交互后,算是对Flutter入门了,基本可以实现一些普通页面搭建和交互效果了.但是这远远还不够,现在App都是需要网络访问的,而今天的目标就是学习IO和网络这一块. 二.Da ...

  3. 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

  4. go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)

    go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...

  5. Go开发 之 容器(数组Array、切片slice、映射map、列表list)

    文章目录 0.唠唠叨叨 1.数组-Array 1.1.什么是数组 1.1.1.数组的声明 1.1.2.比较两个数组是否相等 1.1.3.示例 1.1.3.1.通过索引下标访问元素 1.1.3.2.数组 ...

  6. Golang如何遍历切片slice

    前言 这两天用golang开发一个把企业微信的打卡记录同步到HR-OA系统的一个中间表的功能,同步时把从企业微信接口里查询到的打卡记录放到一个对象的切片里,然后遍历切片把每条打卡记录写到中间表,这里涉 ...

  7. go数组Array和切片Slice全面简述理解

    小聊:本文是小白刚学习 golang 时候的总结,在基本学习了解之上的特性比较与讨论,go的数组有什么不同?切片又有什么好处?怎么去区分它们的使用?外加一些知识的拓展,有利于加深对 go 的 Arra ...

  8. boost log 能不能循环覆盖_前端基础进阶(十四):深入核心,详解事件循环机制...

    Event Loop JavaScript的学习零散而庞杂,很多时候我们学到了一些东西,但是却没办法感受到进步!甚至过了不久,就把学到的东西给忘了.为了解决自己的这个困扰,在学习的过程中,我一直在试图 ...

  9. js中如何得到循环中的点击的这个id_Js篇面试题9请说一下Js中的事件循环机制

    虽互不曾谋面,但希望能和您成为笔尖下的朋友 以读书,技术,生活为主,偶尔撒点鸡汤 不作,不敷衍,意在真诚吐露,用心分享 点击左上方,可关注本刊 标星公众号(ID:itclanCoder) 如果不知道如 ...

最新文章

  1. .exe已停止工作_这几天我遇到了前所未有的问题windows10 1809 explorer.exe资源管理器频繁崩溃...
  2. 小小聊天室,慢慢的回忆啊!(TCP 通信实现)
  3. .NET Core + Kubernetes:Pod
  4. 云南计算机专业知识真题,2014年云南省事业单位考试专计算机专业知识模拟真题.doc...
  5. golang配置环境排坑
  6. iPhone 史上最大优惠;摩拜「裁员门」反转;百度网盘缩减空间 | 极客头条
  7. screen 命令使用及示例
  8. 电商巨头Shopify 两名员工被指窃取客户交易详情
  9. 适合MySQL master/slave模式的JDBC driver: lbpool
  10. ajax验证本服务器,jquery – 使用Ajax调用的http基本身份验证
  11. 【数据结构笔记13】C实现:判别是否是同一颗二叉搜索树(BST)
  12. linux笔记_防止ddos攻击
  13. ubuntu16中,google浏览器安装OneNote Web Clipper插件
  14. Simulink中.sxl文件与.mdl文件的区别
  15. android 9.0极光推送闪退,极光推送集成Module中遇到的坑
  16. 预设Date时间格式化参数
  17. 32-SIFI特征点提取(EmguCV学习)
  18. 回想让你最有成就感的bug是什么?你是如何发现这个bug的?
  19. 苹果测试充电速度软件,数据传输以及充电速度测试
  20. ArcGIS Portal发布slpk失败,Error999999

热门文章

  1. 保研文书——成绩证明模板
  2. 1.7Web前端基础笔记
  3. 课程9:PLC常用指令之上升沿与下降沿(工控PLC工程师入门必读,5天可上手调试)
  4. 一人之下被动进阶鸿蒙,一人之下:乱金柝是“风后奇门”的核心技能?网友:是,并不完全是!...
  5. Keil MDK-ARM软件官网最新版本的下载方法
  6. java BIO模型demo
  7. [Leetcode]5970. 参加会议的最多员工数
  8. ubuntu18.04编译4.15内核过程
  9. 用 addr2line 定位 OOPS 死机代码位置
  10. 高等数学:非齐次线性微分方程解的结构(含例题解析)