Go 使用自己的结构(解码的JSON)初始化外部库结构时出现类型错误
我有一个结构,它是从JSON http POST req解码的。 我创建此结构的目的是: -简化来自客户端的JSON请求 -在另一个(外部库)结构中使用结构属性数据 如果我必须只使用外部库结构,那么客户端JSON设置看起来会很混乱。 如何在另一个结构(尤其是它们的数组)中使用我的结构值 对于一些简单类型的值,我有一个有效的解决方案 考虑以下几点: 外部库结构:Go 使用自己的结构(解码的JSON)初始化外部库结构时出现类型错误,go,struct,Go,Struct,我有一个结构,它是从JSON http POST req解码的。 我创建此结构的目的是: -简化来自客户端的JSON请求 -在另一个(外部库)结构中使用结构属性数据 如果我必须只使用外部库结构,那么客户端JSON设置看起来会很混乱。 如何在另一个结构(尤其是它们的数组)中使用我的结构值 对于一些简单类型的值,我有一个有效的解决方案 考虑以下几点: 外部库结构: type ExtStruct struct { From *Email
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
可能是巨大的,这无关紧要;所有其他未封送的字段将设置为空值,但封送将成功。