aws-sdk-go中dynamodbattribute反序列化Map列表后结果为空
解决DynamoDB反序列化后items为空的问题
嘿,我来帮你搞定这个问题!你遇到的items为空的情况,核心原因是Go结构体字段的可见性规则,还有几个小细节需要调整,我一步步给你说清楚:
1. 最关键的问题:结构体字段可见性
Go里只有大写开头的字段是对外公开的,而dynamodbattribute.UnmarshalListOfMaps属于外部包,根本访问不到你结构体里小写的requestStatus和timestamp字段,自然没法把DynamoDB的数据反序列化进去,最后items就只能是空的。
你得把所有需要反序列化的字段改成大写开头,要是DynamoDB表里的列名和大写后的字段名不一样(比如表里是requestStatus,你结构体改成RequestStatus),还要加上dynamodbav标签做映射:
type StatusItem struct { RequestStatus string `dynamodbav:"requestStatus"` // 映射DynamoDB里的requestStatus列 Timestamp string `dynamodbav:"timestamp"` // 映射timestamp列 RequestId string `dynamodbav:"RequestId"` }
要是表里的列名和大写后的字段名完全一致(比如列名就是RequestStatus),标签可以省略,但加上标签能更明确,避免后续出问题。
2. 修复打印语句的小错误
你的fmt.Printf少了格式字符串,运行起来要么没输出要么输出乱码,得改成这样:
for i, item := range items { fmt.Println(i) fmt.Printf("RequestId: %s, 状态: %s\n", item.RequestId, item.RequestStatus) }
3. 额外排查小技巧
要是改完字段还是空,先打印一下result.Items看看原始数据有没有:
fmt.Printf("DynamoDB返回的原始数据: %v\n", result.Items)
如果result.Items本身就是空的,那说明你的查询条件、表名或者权限有问题,得先排查DynamoDB查询本身的问题。
内容的提问来源于stack exchange,提问作者Nate
相关产品推荐
相关产品推荐

