You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中循环Unmarshal DynamoDB项返回重复结果的原因咨询

问题原因分析与解决

第一种循环方式的问题

你在循环外仅声明了一个Users实例user,每次调用attributevalue.UnmarshalMap时,都是把当前dbItem的数据覆盖到同一个实例的指针字段指向的内存空间。由于User和Email是指针类型,它们的内存地址在实例创建时就固定了,每次Unmarshal只是更新指针指向的字符串值,而非重新分配新的指针。

如果后续你把这个user实例多次添加到切片中,切片里的每个元素其实是user的副本,但副本里的指针字段依然指向同一个内存地址,最终所有元素都会显示最后一次Unmarshal覆盖后的值,且指针地址完全相同。

第二种循环方式的问题

你的代码存在语法错误:&Users是取类型的地址,这是无效操作。即便修正为使用同一个外部声明的user变量,也会遇到和第一种方式完全相同的问题——所有append的元素共享指针字段的内存地址,最终被最后一次Unmarshal覆盖。

正确的循环处理方式

每次循环都创建新的Users实例,确保每个实例的指针字段拥有独立的内存空间:

type Users struct {
    User  *string `dynamodbav:"user"`
    Email *string `dynamodbav:"email"`
}

u := []Users{}
for _, dbItem := range dynamoResults.Items {
    // 每次循环创建新的实例
    user := Users{}
    err = attributevalue.UnmarshalMap(dbItem, &user)
    if err != nil {
        // 错误处理逻辑
        continue
    }
    u = append(u, user)
}

为什么UnmarshalListOfMaps能正常工作

attributevalue.UnmarshalListOfMaps内部会自动为每个列表项创建独立的结构体实例,每个实例的指针字段都会分配新的内存地址,自然不会出现覆盖和重复的问题。

内容的提问来源于stack exchange,提问作者exception_thrown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:52:06