在Go中没有分配循环

时间:2015-04-12 02:47:17

标签: loops go

在Go中,如果我想做500次,但我不需要使用索引,有没有办法循环而不分配整数?

像:

for i := 0; i < 500; i++ {
    PlayRandomGame()
}

我不需要或想要在那里分配i

2 个答案:

答案 0 :(得分:8)

该代码中的任何内容都不需要在堆上分配i。它可能在堆栈上,当它超出范围时释放,或者在寄存器中释放,并且在任何一种情况下都不会产生垃圾。 (如果您对如何做到这一点感到好奇,那么该技术称为escape analysis。) 您可以在how TotalAlloc doesn't increase in this sample program中看到它:

package main

import (
    "fmt"
    "runtime"
)

func loop() {
    for i := 0; i < 500; i++ {
    }
}

func main() {
    m1, m2 := new(runtime.MemStats), new(runtime.MemStats)
    runtime.ReadMemStats(m1)
    loop()
    runtime.ReadMemStats(m2)
    fmt.Println("TotalAlloc delta was", m2.TotalAlloc - m1.TotalAlloc)
}

一个计数器是必要的,以确保你以一种方式或另一种方式进行500次循环迭代,所以即使你找到某种方法使计数器隐含(例如r := make([]struct{}, 500); for range r {...}),也没有变量名字,但仍然是一个计数器。

答案 1 :(得分:2)

如果您讨厌计数器,可以使用:

for _ = range make([]struct{}, 500) {
    PlayRandomGame()
}

但是带有计数器的变体更具惯用性。