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

我有几种不同的结构。


这里展示两个:


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 AdsResponse

var struct2 OtherResponse


Get("someURL", struct1)

Get("someURL", struct2)

有什么形式吗?


叮当猫咪
浏览 183回答 3
3回答

慕容708150

我不太明白为什么您将响应作为参数和返回。我认为你不需要退货。您应该传递一个指向响应的指针并用数据填充它。另外,我会返回一个错误而不是布尔值,但这是另一个主题。无论如何,解决方案是使用 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 AdsResponsevar struct2 OtherResponseGet("someURL", &struct1)Get("someURL", &struct2)

萧十郎

您的代码示例有些令人困惑,因为这两个结构似乎相同。我会假设它们在“其他”中的某处有所不同。首先,我通常建议围绕这些类型的 JSON 反序列化创建一个包装器。直接在 JSON 结构上工作是脆弱的。您的大多数程序不应该意识到数据以 JSON 格式存储的事实。因此,例如,您可以将它包装在一个Ads包含 an的结构中AdsResponse,或者只是从中复制它关心的部分。这样做也会使下面的一些更容易实现并且不那么脆弱。最常见的解决方案可能是创建一个接口:type Response interface {    ID() int}你让双方Ads和Others顺应Response。然后就可以返回了Response。如有必要,您可以稍后键入 switch 以确定您拥有哪一个并卸载其他数据。switch response := response.(type) {case Ads:    ...case Other:    ...}

12345678_0001

实现这一点的方法是通过 Go 的接口。两种选择:空界面Get(url string, response interface{}) (Response, bool)此选项允许为此函数赋予任何值。自定义界面创建自定义接口将允许您缩小可以作为函数参数提供的类型。在这种情况下,您必须创建一个所有 Response 结构都需要遵守的接口。任何真正遵守该接口的结构都可以用作函数的参数。像这样的东西:type MyResponse interface {    SomeFunction()} 那么你的函数签名可能看起来像Get(url string, response MyResponse) (MyResponse, bool)只要AdsResponse并OtherResponse遵守MyResponse接口,它们将被允许用作函数的参数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go