3 回答
TA贡献1831条经验 获得超4个赞
我不太明白为什么您将响应作为参数和返回。我认为你不需要退货。您应该传递一个指向响应的指针并用数据填充它。另外,我会返回一个错误而不是布尔值,但这是另一个主题。
无论如何,解决方案是使用 interface{}(空接口)。
您很幸运,因为您使用的函数 (FromJsonTo) 接受一个空接口作为参数,因此您可以安全地将参数类型更改为 interface{} 并将其传递给 FromJsonTo。像这样:
func Get(url string, response interface{}) bool {
res, err := goreq.Request{
Uri: url,
}.Do()
// several validations
res.Body.FromJsonTo(response)
return true
}
警告:我没有编译代码。
然后,您将使用 url 和指向响应结构之一的指针调用此函数,如下所示:
var struct1 AdsResponse
var struct2 OtherResponse
Get("someURL", &struct1)
Get("someURL", &struct2)
TA贡献1815条经验 获得超13个赞
您的代码示例有些令人困惑,因为这两个结构似乎相同。我会假设它们在“其他”中的某处有所不同。
首先,我通常建议围绕这些类型的 JSON 反序列化创建一个包装器。直接在 JSON 结构上工作是脆弱的。您的大多数程序不应该意识到数据以 JSON 格式存储的事实。因此,例如,您可以将它包装在一个Ads包含 an的结构中AdsResponse,或者只是从中复制它关心的部分。这样做也会使下面的一些更容易实现并且不那么脆弱。
最常见的解决方案可能是创建一个接口:
type Response interface {
ID() int
}
你让双方Ads和Others顺应Response。然后就可以返回了Response。如有必要,您可以稍后键入 switch 以确定您拥有哪一个并卸载其他数据。
switch response := response.(type) {
case Ads:
...
case Other:
...
}
TA贡献1802条经验 获得超5个赞
实现这一点的方法是通过 Go 的接口。
两种选择:
空界面
Get(url string, response interface{}) (Response, bool)
此选项允许为此函数赋予任何值。
自定义界面
创建自定义接口将允许您缩小可以作为函数参数提供的类型。
在这种情况下,您必须创建一个所有 Response 结构都需要遵守的接口。任何真正遵守该接口的结构都可以用作函数的参数。
像这样的东西:
type MyResponse interface {
SomeFunction()
}
那么你的函数签名可能看起来像
Get(url string, response MyResponse) (MyResponse, bool)
只要AdsResponse并OtherResponse遵守MyResponse接口,它们将被允许用作函数的参数。
- 3 回答
- 0 关注
- 182 浏览
添加回答
举报