忽略Go范围内的值

时间:2018-03-09 10:42:04

标签: go memory range ignore

我对Go range以及忽略返回值的方式有疑问。

正如文档所示,每次迭代range都会产生两个值 - 索引和当前元素的副本,因此如果在迭代期间我们想要更改当前elmenet中的字段,或者元素本身我们必须通过elements[index]引用它,因为elment只是一个副本(假设循环看起来像这个for index, element := range elements)。

Go还允许使用_忽略某些返回值,因此我们可以编写for index, _ := elements

但它让我思考。在使用_中的range时,Go是否足够聪明,无法复制?如果它不是,那么如果elements中的元素非常大并且我们有多个进程/ go-routines运行我们的代码,我们就会浪费内存,最好使用基于{{的循环。 1}}。

我是对的吗?

修改

我们也可以使用

len(elements)

这似乎是一个不错的选择。

1 个答案:

答案 0 :(得分:4)

for range构造最多可以产生2个值,但不一定是2个(它也可以是单个索引值或通道上发送的地图键或值,甚至根本不存在)。

引自Spec: For statements:

  

如果范围表达式是一个通道,则最多允许一个迭代变量,否则最多可能有两个。

继续引用:

  

如果最后一个迭代变量是blank identifier,则range子句等同于没有该标识符的同一子句。

这意味着:

for i, _ := range something {}

相当于:

for i := range something {}

因此,第一种情况下的额外空白标识符不会导致额外的分配或复制,而且完全没有必要和无用。