golang泛型函数来处理多种类型

韩昊杰
2022-12-04 / 0 评论 / 51 阅读 / 正在检测是否收录...

golang泛型函数来处理多种类型

这里有golang版本的要求go >= 1.18

为什么需要泛型

编写一个函数用来比较两个数的大小,对于golang这种强类型的语言,要么针对不同的类型分别实现一遍,要么使用 interface{} 类型。

这里有请求的函数举例子,传入不同的类型则需要使用interface{}

显然 interface{} 类型会打破强类型的约束,使程序暴露更多的错误。

func HttpRequest(data interface{}, url string) (Returndata []byte) {

    stu, _ := json.Marshal(&data)

    reader := bytes.NewReader(stu)
    request, err := http.NewRequest("POST", url, reader)

    if err != nil {
        global.GVA_LOG.Error("请求失败!", zap.Error(err))
        return
    }

    request.Header.Set("Content-Type", "application/json")
    request.Header.Set("Connection", "")
    client := &http.Client{Timeout: time.Second * 60}
    response, err := client.Do(request)
    defer response.Body.Close()
    body, _ := ioutil.ReadAll(response.Body)

    return body
}

这个则可以使用泛型来处理

func HttpRequest[T any, R any](data T, url string) (req R) {

    stu, _ := json.Marshal(&data)

    reader := bytes.NewReader(stu)
    request, err := http.NewRequest("POST", url, reader)

    if err != nil {
        global.GVA_LOG.Error("请求失败!", zap.Error(err))
        return
    }

    request.Header.Set("Content-Type", "application/json")
    request.Header.Set("Connection", "")
    client := &http.Client{Timeout: time.Second * 60}
    response, err := client.Do(request)
    defer response.Body.Close()
    body, _ := io.ReadAll(response.Body)
    json.Unmarshal(body, req)
    return req
}

在函数前面使用[] 可以定义他的类型,这里定义了一个T,R ,变量,类型为any

接下来咱们来看看一下这个ang到底是什么类型

lb85niph.png

显而易见了这里的any其实也是一个interface{}类型

之所以引入 any 关键字,主要是让泛型修饰时短一点,少一些括号。any 比 interface{} 会更清爽~

如何调用这个泛型函数呢

returnWxappUploadData := xinDaRequest.HttpRequest[responseUploadWxappType, returnWxappUpload](responseUploadWxapp, "http://127.0.0.1:3000/uploadWxapp")

lb85nlau.png

指定了类型实参(方括号中的类型名),来明确替换你正在调用的函数中类型形参的类型。

0

评论 (0)

取消