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
到底是什么类型
显而易见了这里的any
其实也是一个interface{}
类型
之所以引入 any 关键字,主要是让泛型修饰时短一点,少一些括号。any 比 interface{} 会更清爽~
如何调用这个泛型函数呢
returnWxappUploadData := xinDaRequest.HttpRequest[responseUploadWxappType, returnWxappUpload](responseUploadWxapp, "http://127.0.0.1:3000/uploadWxapp")
指定了类型实参(方括号中的类型名),来明确替换你正在调用的函数中类型形参的类型。
评论 (0)