为了账号安全,请及时绑定邮箱和手机立即绑定

如何传递不同的结构来发挥作用?

如何传递不同的结构来发挥作用?

Go
叮当猫咪 2021-10-18 17:25:38
我有几种不同的结构。这里展示两个:type AdsResponse struct {    Body struct {        Docs []struct {            ID        int  `json:"ID"`            // others        } `json:"docs"`    } `json:"response"`    Header `json:"responseHeader"`}type OtherResponse struct {    Body struct {        Docs []struct {            ID    int     `json:"ID"`            // others        } `json:"docs"`    } `json:"response"`    Header `json:"responseHeader"`}但我不知道如何为这个方法接受并返回两者。func Get(url string, response Response) (Response, bool) {    res, err := goreq.Request{        Uri:         url,    }.Do()    // several validations    res.Body.FromJsonTo(&response)    return response, true}并像这样使用:var struct1 AdsResponsevar struct2 OtherResponseGet("someURL", struct1)Get("someURL", struct2)有什么形式吗?
查看完整描述

3 回答

?
慕容708150

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)


查看完整回答
反对 回复 2021-10-18
?
萧十郎

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:

    ...

}


查看完整回答
反对 回复 2021-10-18
?
12345678_0001

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接口,它们将被允许用作函数的参数。


查看完整回答
反对 回复 2021-10-18
  • 3 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信