登录
首页 >  Golang >  Go问答

重复的 go 切片键值

来源:stackoverflow

时间:2024-03-17 16:48:28 471浏览 收藏

Go 语言中,切片类型的键值重复问题是一个常见的错误。它发生在当使用同一个变量来存储多个切片元素时。这会导致所有切片元素具有相同的值,而不是预期的不同值。为了解决这个问题,应在每次迭代中为每个切片元素分配一个新的变量,以确保它们具有不同的内存空间。这将防止覆盖先前分配的值,并允许每个切片元素包含其自身独特的值。

问题内容

type developer struct {
  name        string   `json:"name"`
  skills      []interface{} `json:"skills"`
}

这是我的结构

var developers []developer
var devdata developer
if searchresult.totalhits() > 0 {
    for _, hit := range searchresult.hits.hits {
        err := json.unmarshal(hit.source, &devdata)
        if err != nil {
            fmt.println("error")
        }
        fmt.println(devdata.skills) // utp here data are correct

        developers = append(developers, devdata)
    }
    //after loop data skills value are not correct
}

但是当生成实际数据时,所有数组的技能都是相同的

expected : ['name' : 'John Doe','skills': ["php","go"]], ['name' : 'Rovvie Doe','skills': ["java","haskel]]

But output :  ['name' : 'John Doe','skills': ["java","haskel"]], ['name' : 'Rovvie Doe','skills': ["java","haskel]]

解决方案


您在 for 循环的每次迭代中重复使用相同的 devData 变量,以及其分配的内存。这意味着当您调用 json.Unmarshal 并将其传递给 devData 的指针时,您将覆盖上一次迭代期间写入该内存的内容。

您不应在 if 语句上方声明 devData 变量,而应在 for 循环内声明它,以获得为每个迭代变量分配的新内存段。

请注意,如果变量的类型是无指针的,那么您可以使用原始方法,因为 Go 是按值传递的,并且每次将变量传递给函数时,包括 appendshallow 创建该变量值的副本。

但是,由于 go 中的切片确实保存了指向切片第一个元素的指针,因此 Developer 类型(由于其 Skills 字段)不符合条件。

这就是为什么您会看到 Name 字段被正确复制,但 Skills 字段的内容被覆盖。

到这里,我们也就讲完了《重复的 go 切片键值》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于的知识点!

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