gpt4 book ai didi

go - 如何使函数适用于不同的输入类型?

转载 作者:数据小太阳 更新时间:2023-10-29 03:13:59 25 4
gpt4 key购买 nike

我有这个简单的通用请求结构来在我的应用程序中发出获取请求:

package api

import (
"net/http"
"time"
"log"
"app/errors"
)

type Request struct {
Url string
}

func (request *Request) Run(responseObject *AppStatusInfo) *errors.Error {

req, requestErr := http.NewRequest(http.MethodGet, request.Url, nil)

req.Header.Set("Content-Type", "application/json")

timeout := time.Duration(5 * time.Second)

client := &http.Client{
Timeout: timeout,
}

resp, requestErr := client.Do(req)

if requestErr != nil {
return &errors.UnknownError
}

decodeError := DecodeJsonRequestBody(resp, &responseObject)

if (decodeError != nil) {
return &errors.UnknownError
}

defer resp.Body.Close()

return nil
}

这里 responseObject 有 AppStatusInfo 类型的指针,它是一个包含一些字段的结构。

我这样运行它来获取应用程序状态信息并将其放入 appStatusInfo 对象中:

var appStatusInfo AppStatusInfo

req := Request{
Url:config.Config.ApiUrl,
}

req.Run(&appStatusInfo)

所以,这段代码运行良好。

但是,当我想概括 Request 以接受其他类型的响应时,例如 UserProducts,我不知道如何在不将 responseObject *AppStatusInfo 替换为responseObject 接口(interface){},然后用我认为可以改进的 responseObject.(UserProducts) 进行转换。

那么,一旦没有泛型,我该如何让 Request.Run() 接受不同的类型并返回相应的对象?

最佳答案

假设 DecodeJsonRequestBody 将第二个参数传递给 json.Unmarshaljson.Decoder.Decode ,然后这样写。我只显示更改的行:

func (request *Request) Run(responseObject interface{}) *errors.Error {
...
resp, requestErr := client.Do(req)
if requestErr != nil {
return &errors.UnknownError
}
defer resp.Body.Close() // defer close before doing anything else
...
decodeError := DecodeJsonRequestBody(resp, responseObject) // don't take address of responseObject
...
}

你可以这样调用它:

var up UserProducts
err = r.Run(&up)

var asi AppStatusInfo
err = r.Run(&asi)

不需要类型断言和类型转换。

关于go - 如何使函数适用于不同的输入类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42548027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com