关于 Golang 的 iter 性能问题

参考两篇文章:

Some tricks and tips for using for range in GoLang

Handling Large Arrays in Golang: Should You Use For Range or For Loop?

特别是 这里 的 Golang 源代码内容:

1
2
3
4
5
6
7
8
9
// The loop we generate:
// len_temp := len(range)
// range_temp := range
// for index_temp = 0; index_temp < len_temp; index_temp++ {
// value_temp = range_temp[index_temp]
// index = index_temp
// value = value_temp
// original body
// }

可以看到 go 是先复制了一份要迭代的原对象 rangerange_temp,之后对其进行传统 for 迭代。

因此指针 index_temp 所访问的值也是这份副本里的内容,如果有想在循环过程中边修改边存储就容易出问题。

对于大体积的迭代对象,使用 for range 还会付出额外的拷贝时空代价,而这悲惨的与你到底是用 for i, value := range 还是 for i := range 没多大关系…… 无非只是 indexvalue 到底有没有用到而已。