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

为什么count++(而不是count = count + 1)改变了Golang中map返回的方式

为什么count++(而不是count = count + 1)改变了Golang中map返回的方式

Go
函数式编程 2021-11-15 15:18:50
我使用了一个映射,它使用句子中的单词作为键,使用整数作为值。func WordCount(s string) map[string]int {    var m map[string]int    m = make(map[string]int)    var substrings[]string    count := 0    substrings = strings.Split(s, " ")    for i := range substrings {        count = count + 1        m[substrings[i]] = count    }    return m}func main() {       fmt.Println(WordCount("I am learning GO since some days"))}上面的代码总是以正确的顺序显示地图,即map[I:1 am:2 learning:3 GO:4 since:5 some:6 days:7]但如果我改变count = count + 1到count++输出更改为:map[learning:3 GO:4 since:5 some:6 days:7 I:1 am:2]我知道地图迭代在 Golang 中是随机的,但为什么count = count + 1总是导致地图迭代以与 相反的有序方式返回count++?
查看完整描述

1 回答

?
qq_花开花谢_0

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

更改变量值的方式count与地图元素的迭代顺序无关。

没有“正确”的迭代顺序,迭代顺序可以被认为是随机的(在当前的实现中它随机的)。引用语言规范:对于语句

地图上的迭代顺序没有指定,并且不能保证从一次迭代到下一次迭代是相同的。

有关该主题的更多信息,请查看此答案:为什么 Go 不能按插入顺序迭代映射?

Go Tour使用Go Playground提供代码编辑器和运行器。Go Playground 缓存您在其上运行的代码的输出。运行两次完全相同的代码只会显示缓存的输出。

但是,如果您更改代码,则会将其“视为”新代码,它将被编译和运行(并且其输出将在之后缓存)。并且由于它是重新运行的,您可能会观察到一个新的随机顺序 - 您会这样做。

如果您再次更改代码中的某些内容,即使像添加或更改某些注释一样微不足道,输出将(可能)再次更改,请尝试。

有关如何实现 Playground 的更多信息,请参阅博客文章Inside the Go Playground

引用相关部分:

当前端收到编译请求时,它首先检查memcache以查看它是否缓存了该源的先前编译的结果。如果找到,则返回缓存的响应。缓存可防止流行程序(例如Go 主页上的程序)使后端过载。如果没有缓存响应,前端向后端发出 RPC 请求,将响应存储在 memcache 中,解析播放事件,并将 JSON 对象作为 HTTP 响应返回给客户端(如上所述)。

另请注意,从Go 1.12开始,地图在使用fmt包打印时进行排序(以简化测试),因此现在打印相同的地图将始终以相同的顺序列出元素。迭代顺序仍然故意保持不确定性。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

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