У меня есть следующие определения структуры:
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: value of type map[string]interface {} is not assignable to type main.Status
Я думаю, проблема в том, что я пытаюсь преобразовать тип string
в interface
, и он не может получить конкретный тип интерфейса, который вызывает панику.
Мой вопрос в том, как я могу решить эту проблему идиоматическим образом.
Спасибо вам всем.