登录
首页 >  Golang >  Go问答

循环映射时 go 追加很奇怪

来源:stackoverflow

时间:2024-04-07 16:24:35 296浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《循环映射时 go 追加很奇怪》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

当我尝试循环映射(以数组为键)时,我遇到了 golang 奇怪的行为。您可以通过 go 演示来重现它。

https://play.golang.org/p/gnvbjtpor98

package main

import "fmt"

func main() {
    m := make(map[[2]int]bool, 0)
    m[[2]int{1, 2}] = true
    m[[2]int{1, 3}] = true

    res := make([][]int, 0)

    for ke, _ := range m {
        res = append(res, ke[:])
    }

    fmt.Println(res)    
    // expect: [[1 2] [1 3]]
    // actual: [[1 3] [1 3]]


}

这是一个 golang 错误吗?


解决方案


这不是错误,这是预期的行为。变量 ke 已为您的循环定义一次,然后在每次迭代中它都会保留当前映射键的引用。当您将其切片附加到 res 时,您将使用 ke 的引用,该引用在循环结束时引用映射的最后一个键。

解决方案是在循环内创建一个新引用作为临时变量:

for ke, _ := range m {
    v := ke
    res = append(res, v[:])
}

查看官方文档了解更多详情(感谢@Marc的链接):https://github.com/golang/go/wiki/CommonMistakes#using-reference-to-loop-iterator-variable

今天关于《循环映射时 go 追加很奇怪》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>