Go 使用自己的结构(解码的JSON)初始化外部库结构时出现类型错误

Go 使用自己的结构(解码的JSON)初始化外部库结构时出现类型错误,go,struct,Go,Struct,我有一个结构,它是从JSON http POST req解码的。 我创建此结构的目的是: -简化来自客户端的JSON请求 -在另一个(外部库)结构中使用结构属性数据 如果我必须只使用外部库结构,那么客户端JSON设置看起来会很混乱。 如何在另一个结构(尤其是它们的数组)中使用我的结构值 对于一些简单类型的值,我有一个有效的解决方案 考虑以下几点: 外部库结构: type ExtStruct struct { From *Email

我有一个结构,它是从JSON http POST req解码的。 我创建此结构的目的是: -简化来自客户端的JSON请求 -在另一个(外部库)结构中使用结构属性数据

如果我必须只使用外部库结构,那么客户端JSON设置看起来会很混乱。 如何在另一个结构(尤其是它们的数组)中使用我的结构值

对于一些简单类型的值,我有一个有效的解决方案

考虑以下几点: 外部库结构:

type ExtStruct struct {
    From             *Email             
    Subject          string             
    Personalizations []*Personalization
 }
type MyStruct struct {
         From            *Email             
         Subject          string             
         Personalizations []*Personalization
     }
我的库结构:

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),
    }}
Subject
From
值起作用,但我在尝试引用数组值时出错。 我看不出我错在哪里。另外,没有其他选项可以“简化”来自客户机的输入JSON,只能引用另一个更大结构中的值。 如果需要,我可以包括其他引用的结构,但可以将其视为:

type A struct {
    RefB []*B
}

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

我需要我的结构引用C。

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

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

如果它们是不兼容的类型,
Email
Personalization
,则应直接编组到
ExtStruct
,或者自己在类型之间编组


我认为你应该澄清你的答案,也许可以提供一个有效的(但有缺陷的)例子。

好的,所以我发现,切片是不可能的。 如果你提到我的帖子:

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
}

我不知道是否有更聪明的方法,但这就是我最终成功的方式。如果您需要详细说明,请对此进行评论,我将尽力提供

我会尽快补充一些澄清。谢谢你的回答
ExtStruct
MyStruct
是相同的,因此客户端JSON设置也将是相同的。你说得对,这就是最终让我困惑的地方。关键是从客户端创建不太容易混淆的JSON,然后在外部库中使用该数据。这需要更复杂的设置。但JSON将是相同的,所以所有这些似乎都是为了增加工作和复杂性。如果您看到我下面的答案,则不会。简单构建的JSON输入被解码为MyStruct,而ExtStruct中使用的值。正如我所说,我不知道是否有更好的解决方案,但这对我来说很有效。您是否认为客户端JSON在任何方面都受到
ExtStruct
的约束?事实并非如此。JSON可能是
{“Subject”:“Hello”}
ExtStruct
可能是巨大的,这无关紧要;所有其他未封送的字段将设置为空值,但封送将成功。