项目中有个需求,需要实现一个缓存请求结果的函数,可以接收传入不同的结构体参数和不同用这个参数去请求第三方接口的函数。为了实现需求我用到golang的泛型,这里记录一下。
bash
type Aa struct {
A string
AA string
}
type AaResp struct {
A string
AA string
}
func ARequest(param Aa) AaResp {
fmt.Println(param)
//请求第三方获取AaResp
return AaResp{}
}
type Bb struct {
B string
BB string
}
type BbResp struct {
B string
BB string
}
func BRequest(param Bb) BbResp {
fmt.Println(param)
//请求第三方获取AaResp
return BbResp{}
}
type CachaStruct struct {
Result any
cacheString string
}
func Cache[T any, R any](param T, requestFun func(param T) R, cacheKey string) R {
var result R
cacheData := CachaStruct{
cacheString: cacheKey,
Result: &result,
}
if getCache(cacheKey, cacheData) {
return cacheData.Result
} else {
result = requestFun(param)
cacheData.Result = &result
//setCache(cacheData) //这里懒得写set了。
}
return cacheData.Result
}
func getCache(cacheKey string, cacheData CachaStruct) bool {
//查询cache是否存在,如果存在则返回
return true
}
// 然后就可以通用了
func main() {
aParam := Aa{
A: "111",
AA: "111",
}
var aResp AaResp
aResp = Cache(aParam, ARequest, aParam.A)
fmt.Println(aResp)
bParam := Bb{
B: "111",
BB: "111",
}
var bResp BbResp
bResp = Cache(bParam, BRequest, bParam.B)
fmt.Println(bResp)
}