golang使用泛型

项目中有个需求,需要实现一个缓存请求结果的函数,可以接收传入不同的结构体参数和不同用这个参数去请求第三方接口的函数。为了实现需求我用到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)
}
相关推荐
互亿无线明明9 小时前
如何为全球业务构建可扩展的“群发国际短信接口”?
java·c++·python·golang·eclipse·php·erlang
张较瘦_10 小时前
[论文阅读] 软件工程 - 供应链 | 从Log4Shell到Go组件漏洞:一篇文看懂开源依赖安全的核心痛点与解决方案
论文阅读·golang·开源
wadesir10 小时前
Go语言反射之结构体的深比较(详解reflect.DeepEqual在结构体比较中的应用)
开发语言·后端·golang
古城小栈13 小时前
Go 72变之 编成 C语言
c语言·python·golang
卿雪13 小时前
认识Redis:Redis 是什么?好处?业务场景?和MySQL的区别?
服务器·开发语言·数据库·redis·mysql·缓存·golang
foxsen_xia13 小时前
go(基础10)——错误处理
开发语言·后端·golang
雨中散步撒哈拉14 小时前
21、做中学 | 高一上期 |Golang单元测试
golang·单元测试·log4j
熬了夜的程序员14 小时前
【RUSTFS】rustfs的go语言sdk
开发语言·后端·golang
卿雪14 小时前
缓存异常:缓存击穿、缓存穿透、缓存雪崩 及其解决方案
java·数据库·redis·python·mysql·缓存·golang
wan_da_ren15 小时前
Windows 环境下使用 Go Modules 拉取带外层 Basic Auth 的私有 GitLab 仓库 — 完整解决方案
windows·golang·gitlab