【go从零单排】泛型(Generics)、链表

🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在Go语言中,泛型(Generics)允许你编写可以处理不同数据类型的函数和数据结构。
Go在1.18版本中引入了泛型,使得开发者能够更灵活地编写代码,减少重复。
泛型允许你定义一个函数或类型,使其能够接受任意类型的参数,而不需要在定义时指定具体的类型。
💻代码
基本使用
package mainimport "fmt"// 定义一个泛型函数
func Print[T any](value T) {fmt.Println(value)
}func main() {Print(123) // 打印整数Print("Hello Go!") // 打印字符串Print(3.14) // 打印浮点数
}
定义泛型struct
package mainimport "fmt"// 定义一个泛型结构体
type Pair[T any] struct {First TSecond T
}func main() {// 创建一个整型的 PairintPair := Pair[int]{First: 1, Second: 2}fmt.Println(intPair)// 创建一个字符串的 PairstringPair := Pair[string]{First: "Hello", Second: "World"}fmt.Println(stringPair)
}
使用约束类型
package mainimport "fmt"// 定义一个约束,只接受数字类型
type Number interface {int | int32 | int64 | float32 | float64
}// 定义一个泛型函数
func Add[T Number](a, b T) T {return a + b
}func main() {fmt.Println(Add(1, 2)) // 整数相加fmt.Println(Add(1.5, 2.5)) // 浮点数相加
}
切片、链表泛型
= = !看不懂警告,大片注释来袭!!
package mainimport "fmt"// 定义一个函数SlicesIndex,输入一个切片 s 和一个值 v,返回一个int类型
// 这里看不懂,先别急,下面我会好好解释
// S ~[]E:这里 S 是一个类型参数,表示它是一个切片类型([]E)
// 使用了类型约束 ~,表示 S 可以是任何基于 E 的切片类型(例如 []int、[]string 等)。
// E comparable:E 是另一个类型参数,表示可以与其他值进行比较的类型(如整型、字符串等)
// comparable 是一个内置的约束,表示该类型支持相等比较。
// s S:函数的第一个参数 s 是一个切片,类型为 S。
// v E:函数的第二个参数 v 是要查找的值,类型为 E
func SlicesIndex[S ~[]E, E comparable](s S, v E) int {//在切片中查找值 v 的索引,找不到时返回-1for i := range s {if v == s[i] {return i}}return -1
}// type List[T any]:定义一个名为 List 的泛型类型。
// T 是一个类型参数,any 表示 T 可以是任何类型。
type List[T any] struct {head, tail *element[T]//head 和 tail 是两个字段,分别指向链表的头部和尾部元素//*element[T] 表示这两个字段是指向 element[T] 类型的指针。}// element[T] 定义结构体类型,类型是any,数据为val 任意类型,指向下一个节点的指针next *element[T]
type element[T any] struct {next *element[T]val T
}// 定义函数Push ,lst 是指向链表的指针注意写法是List[T],可以直接修改链表的内容。
// v T 是要插入链表中的值,类型为 T,即链表支持的任意类型。
func (lst *List[T]) Push(v T) {//判断链表的尾指针 tail 是否为 nilif lst.tail == nil {//如果链表为空,创建一个新的 element[T],并将其值设置为 v,然后将这个新元素的内存地址赋值给链表的头指针 headlst.head = &element[T]{val: v}//将 tail 指向 head,因为此时链表中只有一个元素lst.tail = lst.head} else {//如果链表非空,创建一个新的 element[T],并将其值设置为 v,然后将这个新元素链接到当前 tail 的 next 指针上。lst.tail.next = &element[T]{val: v}//更新 tail 指针,使其指向新添加的元素,保持 tail 始终指向链表的最后一个元素。lst.tail = lst.tail.next}
}// 输入:定义函数AllElements,lst 是指向链表的指针
// 输出:返回一个 []T 类型的切片,包含链表中的所有元素。
func (lst *List[T]) AllElements() []T {//定义空的切片 elems,用于存储链表中的所有元素。var elems []T//for循环从链表的头部开始遍历。//e 是当前节点的指针,初始指向链表的头部 lst.head//循环条件是 e 不为 nil(即未到达链表末尾)//在每次循环中,将当前节点 e 的值 e.val 添加到切片 elems 中for e := lst.head; e != nil; e = e.next {elems = append(elems, e.val)}//循环结束后,返回包含链表中所有元素的切片 elemsreturn elems
}func main() {var s = []string{"foo", "bar", "zoo"}fmt.Println("index of zoo:", SlicesIndex(s, "zoo"))_ = SlicesIndex[[]string, string](s, "zoo")//定义一个 List[int] 类型的变量 lst,这是一个空的整型链表lst := List[int]{}//调用push向链表添加元素lst.Push(10)lst.Push(13)lst.Push(23)//打印链表中的全部元素fmt.Println("list:", lst.AllElements())
}//输出
//index of zoo: 2
//list: [10 13 23]
🔍泛型理解
- 代码中看到[T any]之类的字眼就表示这是泛型
- 灵活性:泛型使得函数和数据结构能够处理多种类型,减少了代码重复。
- 类型安全:在编译时检查类型,确保类型安全。
- 简化代码:通过泛型,可以编写更简洁和可重用的代码。
链表、切片泛型还需要多加练习掌握。
无他,唯手熟尔。
💪无人扶我青云志,我自踏雪至山巅。

相关文章:
【go从零单排】泛型(Generics)、链表
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在Go语言中,泛型(Generics)允许你编写可以处理…...
IoTDB 与 HBase 对比详解:架构、功能与性能
五大方向,洞悉 IoTDB 与 HBase 的详尽对比! 在物联网(IoT)领域,数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长,开发者和决策者们需要选择…...
推荐一款ETCD桌面客户端——Etcd Workbench
Etcd Workbench 我相信很多人在开始管理ETCD的时候都去搜了Etcd客户端工具,然后找到了官方的Etcd Manager,但用完之后发现它并不好用,还不支持多连接和代码格式化,并且已经好几年不更新了,于是市面上就有了好多其他客…...
01 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究
文章目录 Oracle 数据库存储结构深度解析:从数据文件到性能优化的全链路探究一、Oracle存储结构的物理层次1.1 控制文件(Control File)1.2 联机重做日志文件(Online Redo Log File)1.3 数据文件(Data File&…...
AI教育革命:个性化学习的新篇章
内容概要 在 教育 领域,人工智能 的崭露头角带来了前所未有的变化。如今,个性化学习 已不再是一个遥不可及的梦想,而是通过 AI 技术真正实现的可能。借助先进的数据分析能力,教师可以实时跟踪和评估每位学生的学习进度࿰…...
【网络原理】万字详解 UDP 和 TCP
🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 文章目录 1. UDP1.1 UDP 报文格式1.1.1 源端口/目的端口1.1.2 报文长度1.1.3 校验和 2. TCP2.1 TCP 报文结构2.2 TCP 特…...
从零开始搭建Halo个人博客
前言 老话说得好,好记性不如烂笔头。对于程序员来说,学无止境,需要学习的东西很多,而如果不记录下来可能过不了多久就忘记了,而记录下来这一步也能很好地贯彻费曼学习法。 其实网上有很多博客平台,但是自…...
AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO
2024.11.9更新 开关mpo ulps 感觉有用但是还是掉驱动,现在确定是window顶驱动问题 按网上的改注册表和组策略会让自己也打不上驱动 目前感觉最好的办法就是,重置此电脑,然后你就摆着电脑挂个十分钟半小时别动,一开始他是不显示…...
数据结构——二叉树(续集)
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…...
ElasticSearch学习篇16_《检索技术核心20讲》进阶篇之空间检索
背景 学习极客实践课程《检索技术核心20讲》https://time.geekbang.org/column/article/215243,文档形式记录笔记。 相关问题: 查询范围固定的需求 直接计算两点之间距离区域二进制编码GeoHash编码 查询范围不固定的需求 GeoHash编码索引结构设计 基于…...
uni-app跨域set-cookie
set-cookie的值是作为一个权限控制的 首先,无论什么接口都会返回一个set-cookie,但未登录时,set-cookie是没有任何权限的 其次,登录接口请求时会修改set-cookie,并且在后续其他接口发起请求时,会在请求头…...
移动应用开发:简易登录页
文章目录 简介一,创建新活动二,设计UI布局三,编写活动代码四,运行应用程序注意 简介 使用Android Studio编写的简单Android 登录应用程序,该应用程序包含一个登录界面,具有账号和密码两个文本框࿰…...
C++_ C++11的override和final
文章目录 1. override 关键字2. final 关键字在虚函数上使用 final在类上使用 final 1. override 关键字 用于明确表示派生类中的某个虚函数是用来重写基类中的虚函数的,这样编译器会检查基类,看看是否确实存在同样的虚函数,如果没有匹配&am…...
【MyBatis源码】SQL 语句构建器AbstractSQL
文章目录 介绍org.apache.ibatis.jdbc.SQLSQL类使用示例SelectProvider搭配动态SQLAbstractSQL类源码分析 介绍 当我们需要使用Statement对象执行SQL时,SQL语句会嵌入Java代码中。SQL语句比较复杂时,我们可能会在代码中对SQL语句进行拼接,查…...
C++OJ_二叉树的层序遍历
✨✨ 欢迎大家来到小伞的大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C_OJ 小伞的主页:xiaosan_blog 二叉树的层序遍历 102. 二叉树的层序遍历 - 力扣(LeetCode࿰…...
什么是直方图算法
什么是直方图算法? 直方图算法是一种优化决策树分裂点搜索效率的算法,被广泛应用于像 LightGBM 和 XGBoost 这样的梯度提升决策树框架中。其核心思想是通过将连续特征的取值范围离散化为有限的区间(称为 bins),在这些…...
pg_dump -Fc 导出的自定义格式数据库文件 相关操作
实例 将 test.dmp 文件转换为普通SQL内容, 并打印到屏幕 pg_restore -U postgres -Fc -f - test.dump将 test.dmp 文件转换为普通SQL内容, 并输出到 test.sql 文件中 pg_restore -U postgres -Fc -f test.sql -v test.dump备份得到自定义格式的数据库文件(dmp) pg_dump -U…...
Oh My Posh安装
nullSet up your terminalhttps://ohmyposh.dev/docs/installation/windows Git ee oh-my-posh: Windows上的oh-my-zsh,源地址 https://github.com/JanDeDobbeleer/oh-my-posh.git (gitee.com)https://gitee.com/efluent/oh-my-posh...
Node.js——fs模块-文件夹操作
1、借助Node.js的能力,我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束,欢迎大家评论区…...
15分钟学 Go 实战项目三 : 实时聊天室(学习WebSocket并发处理)
实时聊天室:学习WebSocket并发处理 目标概述 在本项目中,我们将创建一个实时聊天室,使用Go语言和WebSocket来处理并发消息交流。这将帮助你深入理解WebSocket协议的工作原理以及如何在Go中实现并发处理。 1. 项目需求 功能需求 用户可以…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...
