【问题标题】:Behaviour of order in the range over map in this Golang program [duplicate]此 Golang 程序中地图范围内的顺序行为
【发布时间】:2018-05-30 02:26:44
【问题描述】:

我是一名初级程序员,正在浏览一些 GitHub 存储库,并使用地图找到了这个简单的经典 fizzbuzz implementation。但是,当我运行它几次时,当isMultiple 对于35 都是true 时,它会打印buzzfizz。例如,偶尔对于值1560,它可能会打印buzzfizz 而不是fizzbuzz,这对我来说似乎不一致并且让我很好奇修复它。有人可以解释为什么会发生这种情况以及我在这里缺少什么吗?它仅仅是一种语言行为还是可以改进代码以实现这种一致性?

package main

import (
    "fmt"
)

func isMultiple(i,j int)bool  {
    return i%j==0
}
func main(){
    fizzbuzz:=make(map[int]string)
    fizzbuzz[3]="fizz"
    fizzbuzz[5]="buzz"
    for i:=1; i<101; i++ {
        str:=""
        for k,v:=range fizzbuzz{
            if isMultiple(i,k)==true{str+=v}
        }
        fmt.Println(i,":",str)
    }

}

编辑:决定将代码放在这里,以查看通用约定,最好放在这里。

【问题讨论】:

  • 不看代码谁也解释不了。
  • 地图是无序的数据结构,所以它们的迭代顺序是不确定的。
  • 不是关于你的问题,而是风格上“isMultiple(i,k)==true”应该改写为“isMultiple(i,k)”

标签: go fizzbuzz


【解决方案1】:

Go map 是无序的数据结构,你不应该依赖键的顺序。

为防止开发人员意外依赖小地图排序,Go 每次都会随机化小地图。

请在 Go 地图上read up

【讨论】:

  • 另见the spec:“未指定映射的迭代顺序,也不保证从一次迭代到下一次迭代顺序相同。”
猜你喜欢
  • 2016-11-06
  • 1970-01-01
  • 2023-03-28
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多