其他分享
首页 > 其他分享> > golang 实践

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