为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中没有分配的循环

在 Go 中没有分配的循环

Go
jeck猫 2021-09-27 20:51:53
在 Go 中,如果我想做 500 次,但我不需要使用索引,有没有办法在不分配整数的情况下进行循环?喜欢:for i := 0; i < 500; i++ {    PlayRandomGame()}我不需要或不想在i那里分配。
查看完整描述

2 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

该代码中的任何内容都不需要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)

}

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


查看完整回答
反对 回复 2021-09-27
?
白衣染霜花

TA贡献1796条经验 获得超10个赞

如果你讨厌计数器,你可以使用这个:


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

    PlayRandomGame()

}

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


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 244 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信