在Go中没有分配循环

Kev*_*rke -2 loops go

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

喜欢:

for i := 0; i < 500; i++ {
    PlayRandomGame()
}
Run Code Online (Sandbox Code Playgroud)

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

two*_*two 8

该代码中的任何内容都不需要i在堆上分配.它可能在堆栈上,当它超出范围时释放,或者在寄存器中释放,并且在任何一种情况下都不会产生垃圾.(如果您对这种可能性感到好奇,那么该技术称为转义分析.)您可以在此示例程序中看到TotalAlloc不会增加的方式:

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)
}
Run Code Online (Sandbox Code Playgroud)

一个计数器是必要的,以确保你以一种方式或另一种方式进行500次循环迭代,所以即使你找到一些方法使计数器暗示(r := make([]struct{}, 500); for range r {...}比方说),也没有变量名称,但仍然是一个计数器下的盖子.