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

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类型不兼容,因此报错。

修复步骤

  1. 替换序列化方法:在v1 SDK体系下,应该使用dynamodbattribute.UnmarshalListOfMaps来处理DynamoDB返回结果,而非v2的attributevalue包方法。

  2. 导入正确的包:确保代码中导入v1的序列化包:

import "github.com/aws/aws-sdk-go/service/dynamodb/dynamodbattribute"
  1. 修改反序列化代码:
    将原来的代码行:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 21:52:42