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
相关产品推荐
相关产品推荐

