无法将 dynamodb 结果解组到字段定义为类型接口的结构中
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《无法将 dynamodb 结果解组到字段定义为类型接口的结构中》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
问题内容我有以下结构定义:
type job struct {
id string `json:"id" dynamodbav:"id"`
ref string `json:"ref_id" dynamodbav:"ref_id"`
created string `json:"created_at,omitempty" dynamodbav:"created_at"`
stages map[string]status `json:"stages,omitempty" dynamodbav:"stages"`
}
// status interface
type status interface {
getmessage() string
}
// failure struct
type failure struct {
message string `json:"error_message,omitempty" dynamodbav:"message"`
}
// getmessage returns the error message
func (f *failure) getmessage() string {
return f.message
}
// success struct
type success struct {
message string `json:"success_message,omitempty" dynamodbav:"message"`
}
// getmessage returns the success message
func (s *success) getmessage() string {
return s.message
}
其中 failure 和 success 结构满足 status 接口
我正在尝试将 dynamodb 的响应解组到 job 结构中,如下所示:
func getjobbyid(id, table string) (*job, error) {
var (
db = dynamodb.new(sess)
key = map[string]*dynamodb.attributevalue{
"id": {
s: aws.string(id),
},
}
ip = &dynamodb.getiteminput{
tablename: aws.string(table),
key: key,
}
)
res, err := db.getitem(ip)
if err != nil {
return nil, err
}
if res.item == nil {
return nil, errors.new("not found")
}
var j *job
if err := dynamodbattribute.unmarshalmap(res.item, &j); err != nil {
return nil, err
}
return j, nil
}
dynamodb 对象看起来像
{
"created_at": {
"S": "2020-07-21T06:40:53Z"
},
"id": {
"S": "ca237361-7deb-4a28-872d-a602b9b1df67"
},
"stages": {
"M": {
"stage1": {
"M": {
"message": {
"S": "Completed"
}
}
},
"stage2": {
"M": {
"message": {
"S": "Completed"
}
}
},
"stage3": {
"M": {
"message": {
"S": "Completed"
}
}
}
}
},
"ref_id": {
"S": "test-reference"
}
}
我得到的错误是:
panic:reflect.set:map[string]interface {}类型的值不可分配给main.status
类型
我认为问题在于,我试图将类型 string
解组到 interface
中,并且无法获取导致恐慌的接口的具体类型。
我的问题是如何以惯用的方式解决这个问题。
谢谢大家。
解决方案
如果不查看 dynamodbattribute.unmarshalmap
的实现,最终的 unmarshal
将失败,因为您尝试解组到自定义接口 status
。这不会起作用,因为运行时无法知道要解组到的底层结构。
Here's 一个类似设置的演示示例,仅使用 json
。
即使目视检查你的 json,你也无法确定是否
"message": {"s": "completed"}
是成功还是错误。
您应该将 map[string]status
中的 status
替换为结构体(如下所示),甚至 map[string]string
,以便解组工作
{
Message string
}
根据我之前分享的失败示例,here 是使其发挥作用的方法之一。
以上就是《无法将 dynamodb 结果解组到字段定义为类型接口的结构中》的详细内容,更多关于的资料请关注编程网公众号!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341