dpt62283 2019-07-11 15:15
浏览 71
已采纳

使用golang向DynamoDB封送/解组“枚举”

I have the following PartnerType "enum" struct in go:

// 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"`
}

When doing a dynamodbattribute.MarshalMap() I'd like my PartnerType to be stored as a string. The dynamodbav struct tag allows you to store an int as a string (dynamodbav:",omitempty,string") however it is not calling my defined .String() or Marshal/Unmarshal implementations.

Said another way, it stores PartnerTypeTest as "1" not "TEST".

How can this be done?

  • 写回答

1条回答 默认 最新

  • douna2633 2019-07-11 16:38
    关注

    For dynamodb you can implement your marshaler/unmarshaler for enums

    Try the following:

    // 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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器