golang 实践
作者:互联网
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
标签:迭代,no,int,性能,实践,golang,persons,range 来源: https://www.cnblogs.com/youxin/p/16101205.html