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

go tour泛型

5 泛型

类型参数

  • s 是满足内置约束 comparable 的任何类型 T 的切片。 x 也是相同类型的值。
  • comparable 是一个有用的约束,它能让我们对任意满足该类型的值使用 ==!= 运算符。
func Index[T comparable](s []T, x T) int
// Index 返回 x 在 s 中的下标,未找到则返回 -1。
func Index[T comparable](s []T, x T) int {for i, v := range s {// v 和 x 的类型为 T,它拥有 comparable 可比较的约束,// 因此我们可以使用 ==。if v == x {return i}}return -1
}func main() {// Index 可以在整数切片上使用si := []int{10, 20, 15, -10}fmt.Println(Index(si, 15))// Index 也可以在字符串切片上使用ss := []string{"foo", "bar", "baz"}fmt.Println(Index(ss, "hello"))
}2
-1

练习 泛型类型

作为练习,请为此链表的实现添加一些功能。

  • 用全局函数 AddDelete,传递双指针 **List[T],避免方法接收者语法问题。
  • Tcomparable 约束,保证可以用 ==
  • 其他方法(如 FindTraverse)仍然用方法接收者 *List[T],这样 intList.Traverse() 能正常调用。
  • 无比较使用T any。有比较操作使用T comparabel
package mainimport "fmt"// List 表示一个可以保存任何类型的值的单链表。
type List[T any] struct {next *List[T]val  T
}// NewList 创建一个新的空链表(返回头指针为 nil)
func NewList[T any]() *List[T] {return nil
}// Add 在链表末尾添加一个节点
func Add[T any](l **List[T], value T) {newNode := &List[T]{val: value}if *l == nil {*l = newNode} else {current := *lfor current.next != nil {current = current.next}current.next = newNode}
}// Delete 删除链表中第一个值等于 value 的节点
func Delete[T comparable](l **List[T], value T) {if *l == nil {return}if (*l).val == value {*l = (*l).nextreturn}current := *lfor current.next != nil && current.next.val != value {current = current.next}if current.next != nil {current.next = current.next.next}
}// Find 查找链表中第一个值等于 value 的节点
func Find[T comparable](l *List[T], value T) *List[T] {current := lfor current != nil {if current.val == value {return current}current = current.next}return nil
}// Traverse 遍历链表并打印每个节点的值
func Traverse[T any](l *List[T]) {current := lfor current != nil {fmt.Print(current.val, " ")current = current.next}fmt.Println()
}//链表长度
func Len[T any](l *List[T]) int {current := lcount:=0for current != nil {count++current = current.next}return count
}func Reverse[T any](l *List[T]) *List[T] {var newHead *List[T] = nilcurrent := lfor current != nil {next := current.nextcurrent.next = newHeadnewHead = currentcurrent = next}return newHead
}func main() {// 示例:创建 int 类型链表并操作var intList *List[int] = NewList[int]()Add(&intList, 1)Add(&intList, 2)Add(&intList, 3)fmt.Print("链表内容: ")Traverse(intList) // 输出: 1 2 3found := Find(intList, 2)if found != nil {fmt.Println("找到节点:", found.val)}Delete(&intList, 2)fmt.Print("删除后链表内容: ")Traverse(intList) // 输出: 1 3fmt.Printf("链表长度:%v\n",Len(intList))intList=Reverse(intList)fmt.Print("翻转链表内容: ")Traverse(intList) // 输出: 3 1
}
http://www.xdnf.cn/news/9256.html

相关文章:

  • 删除 nexus3 中指定仓库中的所有组件的脚本
  • Halcon联合QT ROI绘制
  • 详解 .net9 内置 Lock 对象,更加现代化和灵活可控的锁对象
  • 分贝计在评估噪音对老年人影响中的具体作用和应用方式
  • qml和JavaScript的QtObject是 QML 中用于存储无界面,纯数据。应用场景:计算器、遥控器、告警类型映射
  • SD08_解决由于anaconda版本过低无法安装高版本python的问题
  • 5分钟入门WPF和FluentValidation数据验证
  • opencv(C++) 图像滤波
  • Dataset和Dataloader
  • VR三维数字空间还原
  • 大模型(4)——Agent(基于大型语言模型的智能代理)
  • 计算机网络基础知识
  • 7000字基于 SpringBoot 的 Cosplay 文化展示与交流社区系统设计与实现
  • 批量文件重命名工具
  • Web安全测试-文件上传绕过-DVWA
  • 【机器学习基础】机器学习入门核心算法:K-近邻算法(K-Nearest Neighbors, KNN)
  • 高效多线程图像处理实战
  • pycharm 新UI 固定菜单栏 pycharm2025 中文版
  • 小样本分类新突破:QPT技术详解
  • Mac M1 安装 ffmpeg
  • winsock对话设计框架
  • 大咖课 | 后期-文本分析
  • 新编辑器编写指南--给自己的备忘
  • 【请关注】VC++ MFC常见异常问题及处理方法
  • 如何使用PHP创建一个安全的用户注册表单,包含输入验证、数据过滤和结果反馈教程。
  • 第三十三天打卡
  • Windows安装Docker部署dify,接入阿里云api-key进行rag测试
  • 新消息!阿里云ACP大模型认证有变化!
  • https下git拉取gitlab仓库源码
  • tmux 入门实用指南(面向远程 Linux 开发者)