golang 实践
2022-04-05 00:23 youxin 阅读(47) 评论(0) 编辑 收藏 举报Golang range循环陷阱
https://zhuanlan.zhihu.com/p/158583555
2. for和range性能大比拼
2.1 切片[]int
通过benchmark对for和range进行测试,遍历 []int 类型的切片,for 与 range 性能几乎没有区别。
2.2 切片[]struct
仅遍历下标的情况下,for 和 range 的性能几乎是一样的。
而同时遍历下标和值时,for 的性能大约是 range 的 2000 倍。
2.3 []int 和 []struct{} 的性能差异
与 for 不同的是,range 对每个迭代值都创建了一个拷贝。因此如果每次迭代的值内存占用很小的情况下,for 和 range 的性能几乎没有差异,但是如果每个迭代值内存占用很大,这种情况下差距就非常明显了。我们可以用以下例子来证明range迭代时返回的是拷贝,而并非元素本身。
persons := []struct{ no int }{{no: 1}, {no: 2}, {no: 3}} for _, s := range persons { s.no += 10 } for i := 0; i < len(persons); i++ { persons[i].no += 100 } fmt.Println(persons) //结果: [{101} {102} {103}]
先对map
进行了初始化,因为map
是*hashmap
,所以这里其实是一个*hashmap
指针的拷贝。
结合着这两个具体的for range
编译器实现,可以看看为什么for range slice
的_
优化方式有用,而for range map
的方式没用呢
https://blog.csdn.net/weixin_34368949/article/details/88728243
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2017-04-05 windows安装 centos
2016-04-05 nginx字体文件配置
2016-04-05 mysql 常见的几个错误问题
2015-04-05 函数名 函数名取地址 区别
2015-04-05 STL make_heap push_heap pop_heap sort_heap
2015-04-05 STL: fill,fill_n,generate,generate_n
2015-04-05 gcc __attribute__