我对Go range
以及忽略返回值的方式有疑问。
正如文档所示,每次迭代range
都会产生两个值 - 索引和当前元素的副本,因此如果在迭代期间我们想要更改当前elmenet中的字段,或者元素本身我们必须通过elements[index]
引用它,因为elment
只是一个副本(假设循环看起来像这个for index, element := range elements
)。
Go还允许使用_
忽略某些返回值,因此我们可以编写for index, _ := elements
。
但它让我思考。在使用_
中的range
时,Go是否足够聪明,无法复制?如果它不是,那么如果elements
中的元素非常大并且我们有多个进程/ go-routines运行我们的代码,我们就会浪费内存,最好使用基于{{的循环。 1}}。
我是对的吗?
修改
我们也可以使用
len(elements)
这似乎是一个不错的选择。
答案 0 :(得分:4)
for range
构造最多可以产生2个值,但不一定是2个(它也可以是单个索引值或通道上发送的地图键或值,甚至根本不存在)。
如果范围表达式是一个通道,则最多允许一个迭代变量,否则最多可能有两个。
继续引用:
如果最后一个迭代变量是blank identifier,则range子句等同于没有该标识符的同一子句。
这意味着:
for i, _ := range something {}
相当于:
for i := range something {}
因此,第一种情况下的额外空白标识符不会导致额外的分配或复制,而且完全没有必要和无用。