gpt4 book ai didi

go - 使用 golang 编码/解码 "enum"到 DynamoDB

转载 作者:数据小太阳 更新时间:2023-10-29 03:08:25 25 4
gpt4 key购买 nike

我在 go 中有以下 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 struct 标记允许您将 int 存储为字符串 (dynamodbav:",omitempty,string") 但它不会调用我定义的 .String() Marshal/Unmarshal 实现。

换句话说,它将 PartnerTypeTest 存储为 "1" 而不是 "TEST"

如何做到这一点?

最佳答案

对于 dynamodb,您可以为枚举实现编码器/解码器

尝试以下操作:

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

关于go - 使用 golang 编码/解码 "enum"到 DynamoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56992450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com