gpt4 book ai didi

arrays - 复制go slices键值

转载 作者:行者123 更新时间:2023-12-01 22:08:48 25 4
gpt4 key购买 nike

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

最佳答案

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

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

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

但是,由于go中的slice确实持有指向该 slice 第一个元素的指针,因此Developer类型由于其Skills字段而没有资格。

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

关于arrays - 复制go slices键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59020197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com