go语言append函数操作struct切片时,如何避免字段值被错误覆盖?
本文分析了在Go语言中使用append函数操作struct切片时可能遇到的一个常见问题:由于变量作用域导致struct字段值被错误覆盖。这个问题通常发生在从数据库读取数据,构建struct切片并返回给前端展示的场景中。
问题复现:程序员从数据库获取多条数据,每条数据对应一个struct。使用append函数将这些struct添加到切片中,但最终结果显示某些字段值被错误地覆盖或修改为相同的值。
代码示例(错误):
var sync infimanage.syncvar synclists []infimanage.sync// ... (数据库读取部分) ...for _, syncs := range syncslist { json.Unmarshal([]byte(syncs), &sync) fmt.Println(sync) // 这里打印输出都是正常的 fmt.Println("xxxxxxxxxxxxxxxxxx") synclists = append(synclists, sync)}// 这里就不正常了fmt.Println(synclists)
登录后复制
问题根源:sync变量在循环外定义,在循环内重复使用。json.Unmarshal函数每次都将数据反序列化到同一个sync变量中,覆盖了之前的数值。因此,append函数始终添加的是最后一次循环中sync的值。如果infimanage.sync是引用类型,所有struct都指向同一内存地址,修改一个会影响所有。
立即学习“go语言免费学习笔记(深入)”;
解决方案:将sync变量的声明移入循环内部:
var synclists []infimanage.sync// ... (数据库读取部分) ...for _, syncs := range syncslist { var sync infimanage.Sync // 将sync变量的声明移入循环内部 json.Unmarshal([]byte(syncs), &sync) fmt.Println(sync) fmt.Println("xxxxxxxxxxxxxxxxxx") synclists = append(synclists, sync)}fmt.Println(synclists)
登录后复制
通过将sync变量声明到循环内部,每次循环都会创建一个新的sync变量,避免了变量值的覆盖。append函数每次添加的是一个新的struct实例,而不是同一个实例的多个引用,从而解决了字段值被错误修改的问题。
以上就是Go语言append函数操作struct切片时,如何避免字段值被错误覆盖?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2307010.html