当前位置: 首页 > news >正文

【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 技术真正实现的可能。借助先进的数据分析能力,教师可以实时跟踪和评估每位学生的学习进度&#xff0…...

【网络原理】万字详解 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 登录应用程序,该应用程序包含一个登录界面,具有账号和密码两个文本框&#xff0…...

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&#xff0…...

什么是直方图算法

什么是直方图算法? 直方图算法是一种优化决策树分裂点搜索效率的算法,被广泛应用于像 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. 项目需求 功能需求 用户可以…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟

2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

软件工程 期末复习

瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...