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)
}
相关推荐
geovindu9 小时前
go: Strategy Pattern
开发语言·设计模式·golang·策略模式
开发小程序的之朴10 小时前
基于Go语言的企业级CMS系统架构设计与性能分析——以AnQiCMS为例
开发语言·golang·系统架构
初心未改HD12 小时前
Go语言net/http与Web开发:构建高性能HTTP服务
开发语言·golang
memories19812 小时前
Go 语言 Channel(管道/通道)
开发语言·后端·golang
初心未改HD13 小时前
Go语言结构体Struct:内存布局、标签、接收者与内存对齐
开发语言·golang
jieyucx13 小时前
Go 数据结构入门:线性表、顺序表、链表
数据结构·链表·golang
eLIN TECE14 小时前
Golang 构建学习
开发语言·学习·golang
jieyucx15 小时前
# Go 语言指针零基础入门详解
开发语言·后端·golang
周末也要写八哥16 小时前
Golang语言与Rust语言的对比
开发语言·后端·golang
不甘先生16 小时前
Go 四层架构实战:Handler + Service + Repository + Entity(清晰、可控、可演进)
开发语言·架构·golang