使用golang将“枚举”类型序列化/反序列化到DynamoDB中

3

我在go语言中有以下与“enum”相关的PartnerType结构体:

// PartnerType enum
type PartnerType int

const (
    // PartnerTypeUnknown should never happen
    PartnerTypeUnknown PartnerType = iota

    // PartnerTypeTest test
    PartnerTypeTest
)

func (t PartnerType) String() string {
    names := [...]string{
        "UNKNOWN",
        "TEST"}

    if t < PartnerTypeUnknown || t > PartnerTypeTest {
        return names[0]
    }
    return names[t]
}

// MarshalJSON for enum
func (t PartnerType) MarshalJSON() ([]byte, error) {
    s := t.String()
    return json.Marshal(s)
}

// UnmarshalJSON for enum
func (t *PartnerType) UnmarshalJSON(b []byte) error {
    *t = PartnerTypeUnknown
    return nil
}

// MarshalText implements the text marshaller method
func (t *PartnerType) MarshalText() ([]byte, error) {
    return []byte(t.String()), nil
}

// UnmarshalText implements the text unmarshaller method
func (t *PartnerType) UnmarshalText(text []byte) error {
    *t = PartnerTypeUnknown
    return nil
}

// Partner entity
type Partner struct {
    ID   string `dynamodbav:"PK,omitempty"`
    Foo string `dynamodbav:"SK,omitempty"`
    PartnerType              PartnerType    `dynamodbav:",omitempty,string"`
}

在执行 dynamodbattribute.MarshalMap() 时,我希望将我的 PartnerType 存储为一个字符串。使用 dynamodbav 结构标签,可以将 int 存储为字符串(dynamodbav:",omitempty,string"),但是它没有调用我定义的 .String()Marshal/Unmarshal 实现。
换句话说,它将 PartnerTypeTest 存储为 "1" 而不是 "TEST"
如何实现这个功能?
1个回答

3
对于dynamodb,您可以实现枚举的marshaler/unmarshaler。
尝试以下操作:
// MarshalDynamoDBAttributeValue for ddb
func (t PartnerType) MarshalDynamoDBAttributeValue(av *dynamodb.AttributeValue) error {
    s := t.String()
    av.S = &s
    return nil
}

// UnmarshalDynamoDBAttributeValue implements the Unmarshaler interface
func (t *PartnerType) UnmarshalDynamoDBAttributeValue(av *dynamodb.AttributeValue) error {
    // val := aws.StringValue(av.S)

    *t = PartnerTypeUnknown
    return nil
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接