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)
}
相关推荐
不老刘6 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
Tony Bai12 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
念何架构之路15 小时前
Go进阶之panic
开发语言·后端·golang
先跑起来再说15 小时前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
开开心心就好19 小时前
发票合并打印工具,多页布局设置实时预览
linux·运维·服务器·windows·pdf·harmonyos·1024程序员节
Tony Bai1 天前
“Go 2,请不要发生!”:如果 Go 变成了“缝合怪”,你还会爱它吗?
开发语言·后端·golang
灰子学技术1 天前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
源代码•宸2 天前
大厂技术岗面试之谈薪资
经验分享·后端·面试·职场和发展·golang·大厂·职级水平的薪资
有代理ip3 天前
Python 与 Golang 爬虫的隐藏优势
爬虫·python·golang
天远云服3 天前
天远车辆过户查询API微服务实战:用Go语言构建高性能车况溯源系统
大数据·微服务·架构·golang