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