我有一个结构,该结构是从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),
}}
Subject
和From
的值有效,但是在尝试引用数组值时出现错误。
我看不到我错了。 AFAIK没有其他选项可以“简化”来自客户端的输入JSON,仅引用另一个更大的结构中的值。
如果需要,我可以包含其他引用的结构,但可以将其视为:
type A struct {
RefB []*B
}
type B struct {
RefC []*C
Value string
}
type C struct {
Value string
}
我需要我的结构来引用C。
答案 0 :(得分:1)
也许我误会了,但我认为ExtStruct初始化看起来更像
extStruct := &ExtStruct{
From: myStruct.From,
Personalizations: myStruct.Personalizations,
}
https://play.golang.org/p/lqFFBa7SKGg
如果它们是Email
和Personalization
不兼容的类型,则应直接编组到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
}
我不知道是否有更聪明的方法可以做到这一点,但这是我最终成功的方式。如果您想进行详细说明,请对此发表评论,我将尽力提供。