Go中使用AWS SDK反序列化PartiQL查询结果时类型不匹配问题求助
问题分析与解决
这个类型不匹配问题的核心是你混用了AWS SDK for Go的不同版本或错误的序列化工具:
- 你的代码基于AWS SDK for Go v1(从
session.NewSession和dynamodb.New(sess)的调用方式可以判断),此时response.Items的类型是[]map[string]*dynamodb.AttributeValue。 - 但你调用的
attributevalue.UnmarshalListOfMaps是AWS SDK for Go v2的序列化方法,它要求的参数类型是v2专属的[]map[string]types.AttributeValue,两个版本的SDK类型不兼容,因此报错。
修复步骤
替换序列化方法:在v1 SDK体系下,应该使用
dynamodbattribute.UnmarshalListOfMaps来处理DynamoDB返回结果,而非v2的attributevalue包方法。导入正确的包:确保代码中导入v1的序列化包:
import "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
- 修改反序列化代码:
将原来的代码行:
err = attributevalue.UnmarshalListOfMaps(response.Items, &shows)
替换为:
err = dynamodbattribute.UnmarshalListOfMaps(response.Items, &shows)
修改后的完整GetShows方法:
func (runner PartiQLRunner) GetShows() ([]Show, error) { var shows []Show response, err := runner.DynamoDbClient.ExecuteStatement( &dynamodb.ExecuteStatementInput{ Statement: aws.String(fmt.Sprintf("SELECT * FROM \"%v\" WHERE PK = 1", runner.TableName)), }) if err != nil { log.Printf("Couldn't get info. Here's why: %v\n", err) return shows, err } err = dynamodbattribute.UnmarshalListOfMaps(response.Items, &shows) if err != nil { log.Printf("Couldn't unmarshal response. Here's why: %v\n", err) } return shows, err }
补充说明:如果后续计划升级到AWS SDK for Go v2,需要整体替换SDK的初始化逻辑(比如使用config.LoadDefaultConfig替代session),但基于当前v1的代码框架,按上述步骤修改即可直接解决类型不匹配问题。
内容的提问来源于stack exchange,提问作者logo_positive
相关产品推荐
相关产品推荐

