用自己的结构(解码的JSON)初始化外部库结构会产生类型错误

时间:2019-01-31 12:14:20

标签: go struct

我有一个结构,该结构是从JSON http POST请求中解码的。 我拥有这个结构的目的是: -简化客户端的JSON请求 -在另一个(外部库)结构中使用structs属性数据。

如果我只需要使用外部库结构,则客户端JSON设置将令人困惑。 如何在另一个结构(尤其是它们的数组)中使用结构值?

对于一些具有简单类型的值,我有一个可行的解决方案。

请考虑以下内容: 扩展库结构:

type ExtStruct struct {
    From             *Email             
    Subject          string             
    Personalizations []*Personalization
 }

我的库结构:

type MyStruct struct {
         From            *Email             
         Subject          string             
         Personalizations []*Personalization
     }

这是我的代码,

myStruct := &MyStruct{}
err := json.NewDecoder(body).Decode(myStruct)
extStruct := &ExtStruct{
    Subject: myStruct.Subject,
    From:    (*extStruct.Email)(myStruct.From),
    Personalizations: []*extStruct.Personalization{
        To: ([]*extStruct.Email)(myStruct.To),
    }}

SubjectFrom的值有效,但是在尝试引用数组值时出现错误。 我看不到我错了。 AFAIK没有其他选项可以“简化”来自客户端的输入JSON,仅引用另一个更大的结构中的值。 如果需要,我可以包含其他引用的结构,但可以将其视为:

type A struct {
    RefB []*B
}

type B struct {
    RefC []*C
    Value string
}
type C struct {
    Value string
}

我需要我的结构来引用C。

2 个答案:

答案 0 :(得分:1)

也许我误会了,但我认为ExtStruct初始化看起来更像

extStruct := &ExtStruct{
    From:             myStruct.From,
    Personalizations: myStruct.Personalizations,
}

https://play.golang.org/p/lqFFBa7SKGg

如果它们是EmailPersonalization不兼容的类型,则应直接编组到ExtStruct中,或者自己在类型之间进行编组。

我认为您应该澄清您的答案,也许提供一个可行的(但有错误的)示例。

答案 1 :(得分:0)

好吧,所以我发现,很难切成薄片。 如果您参考我的文章:

extStruct := &ExtStruct{
    Subject: myStruct.Subject,
    From:    (*extStruct.Email)(myStruct.From),
    Personalizations: []*extStruct.Personalization{
        To: ([]*extStruct.Email)(myStruct.To),
    }}

Personalizations切片变为:

Personalizations: ([]*extStruct.Personalization{{
    To: castStruct(myStruct.To),
}}),

还有

func castStruct(input []*myStruct.Email) []*extStruct.Email {
    output := make([]*extStruct.Email, len(input))
    for index, content := range input {
        output[index] = (*extStruct.Email)(content)
    }
    return output
}

我不知道是否有更聪明的方法可以做到这一点,但这是我最终成功的方式。如果您想进行详细说明,请对此发表评论,我将尽力提供。