Go泛型实战教程之如何在结构体中使用泛型
作者:Go学堂 发布时间:2024-05-13 10:45:00
01 目标
假设我们要实现一个blog系统,在该系统中有以下两个结构体:
type Category struct {
ID int32
Name string
Slug string
}
type Post struct {
ID int32
Categories []Category
Title string
Text string
Slug string
}
为了提高系统的性能,我们需要实现一个缓存系统,该缓存可以用于缓存各种类型,在该示例中我们限定为只能缓存Category和Post类型。
02 实现
根据Go泛型使用的三步曲提到的:类型参数化、定义类型约束、类型实例化我们一步步来定义我们的缓存结构体。
第一步:定义类型约束
这里我们先定义类型约束。因为在泛型中对类型参数进行约束是必要条件。所以要先定义类型约束。
因为要对分类Category类型和文章Post类型进行缓存,所以我们这里的缓存类型约束限制在了这两个类型上。约束接口定义如下:
type cacheable interface {
Category | Post
}
第二步:对类型进行参数化
现在我们创建一个名为cache的泛型结构体,并使用cacheable对其进行约束。
type cache[T cacheable] struct {
data map[string]T
}
我们看到cache的底层实际上是用map来进行存储数据的,map的key是具体的类型字符串,而map的值是参数化的类型T,即要在具体使用时根据需要对该参数T进行实例化。
为了能够在cache结构体中存储和获取数据,我们再定义两个方法如下:
func (c *cache[T]) Set(key string, value T) {
c.data[key] = value
}
func (c *cache[T]) Get(key string) (v T) {
if v, ok := c.data[key]; ok {
return v
}
return
}
这里需要大家注意的是在泛型结构体类型中,定义方法的时候,也需要将类型参数T带上的。因为只有在调用时对类型参数实例化后结构体中的类型才是明确的。
第三步:类型实例化
为了实例化cache结构体,我们创建了一个New函数来专门构造cache的实例。
func New[T cacheable]() *cache[T]{
c := cache[T]{}
c.data = make(map[string]T)
return &c
}
这里大家需要注意的是因为我们使用了泛型结构体类型cache,所以函数New也必须是泛型函数,只有这样才能将泛型类型T的具体值传递到泛型结构体类型中。
当然,这里还有另外一种实例化的cache的方法就是直接使用,这样就不需要使用泛型函数New了。如下:
c := &cache[Category]{
data: make(map[string]T)
}
来源:https://juejin.cn/post/7088478439690371086
猜你喜欢
- 今日需求其实就是把Word中的表格转到Excel中,顺便做一个调整。这个需求在实际工作中,很多人还是经常碰到的!如果单单是两个表格,那只要简
- 一,命名空间函数 tf.variable_scope tf.name_scope 先以下面的代码说明两者的区别# 命名空间管理函数'
- 不过先前的 调用方法着实有些繁琐,先实例化->添加参数、变量->写入,搞的跟把大象装冰箱里头一样麻烦。好在作者终于注意到这一点,
- 1、方法说明import cv2 as cvimg1 =cv.imread(filename[, flags])参数说明filename图片
- 误区 #16:多个关于数据的损坏和修复误区 坊间流传的很多版本都不正确 我已经听过很多关于数据修复可以做什么、不可以做什么、什么会导致数据损
- NetworkX是一个非常强大的网络科学工具,它封装了图的数据结构和许多经典图算法,也内置了许多可视化函数可供调用。1. 随机图生成最经典的
- 如何通过Kerberos认证.1.安装Kerberos客户端CentOS:yum install krb5-workstation使用whi
- 本文实例为大家分享了python实现局域网内聊天功能的具体代码,供大家参考,具体内容如下功能: 可以向局域网内开启接收信息功能的ip进行发送
- 代码实现的目的:为一个自定义的类的某个属性在使用它时候,触发某个事件。 该程序的效果:点击输入按钮,弹出一个脚本提示输入框让用户输入他的姓名
- 循环写入字典key、value、删除指定的键值对:原文本‘jp_url.txt'每行元素以逗号分隔:host_key,product
- 我就废话不多说了,大家还是直接看代码 吧~package mainimport ( "fmt" "sort&q
- 如果在prop中传的值为一个没有使用特殊命名规则的变量如:(type),可以顺利传值:<code class="langua
- Python字符串处理学习中,有一道简单但很经典的题目,按照单词对字符串进行反转,并对原始空格进行保留: 如:‘ I love China!
- 这篇文章主要介绍了python 两个数据库postgresql对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 在日常Java后端开发过程中,免不了对数据字段的解析,自然就少不了对字符串的操作,这其中就包含了正则表达式这一块的内容,这里面涉及Java包
- string 对象 1、str.match(RegExp) 在str中搜索匹配RegExp的字符串并保存在一个数组内返回, 如果RegExp
- 最近在做Python 的项目,特地整理了下 Python 序列的方法。序列se
- 前言本文使用 cpu 的 tensorflow 2.8 来完成 GRU 文本生成任务。如果想要了解文本生成的相关概念,可以参考我之前写的文章
- 主题色在variables.less文件的开始,可以看到灰色及品牌色的默认变量及其值@gray-darker: lighten(
- 废话不多说了,具体代码如下所示:<html><head>< >function selectAll(){