Arrays 重复go切片关键值

Arrays 重复go切片关键值,arrays,for-loop,go,Arrays,For Loop,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 se

这是我的结构

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
}

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

与其在
if
station上方声明
devData
变量,不如在
for
循环中声明它,以获得为每个迭代变量分配的新内存段


请注意,如果变量类型为无指针,则可以使用原始方法,因为Go是按值传递的,每次将变量传递给函数(包括
append
)时,都会创建该变量值的浅拷贝

但是,由于go do中的切片包含指向切片第一个元素的指针,
Developer
类型由于其
技能
字段,因此不符合条件


这就是为什么您看到
名称
字段被正确复制,但
技能
字段的内容被覆盖。

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

与其在
if
station上方声明
devData
变量,不如在
for
循环中声明它,以获得为每个迭代变量分配的新内存段


请注意,如果变量类型为无指针,则可以使用原始方法,因为Go是按值传递的,每次将变量传递给函数(包括
append
)时,都会创建该变量值的浅拷贝

但是,由于go do中的切片包含指向切片第一个元素的指针,
Developer
类型由于其
技能
字段,因此不符合条件

这就是为什么你看到
Name
字段被正确复制,而
Skills
字段的内容被覆盖的原因

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]]