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

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
}

相关文章:

  • 【力扣】面试题 01.04. 回文排列
  • 误差反向传播法
  • Linux中的常用命令
  • Linux 6.15 内核发布,新功能
  • nvm和node的环境配置与下载
  • 数据结构与算法Day3:绪论第三节抽象数据类型、算法及其描述
  • Python打卡训练营学习记录Day38
  • 鸿蒙 Form Kit(卡片开发服务)
  • 多空短线决策副图指标,通达信炒股软件指标操盘图文教程
  • rabbitmq的高级特性
  • 016搜索之广度优先BFS——算法备赛
  • UPS的工作原理和UPS系统中旁路的作用
  • 数据库优化常用技巧【面试】
  • 上讯信息运维管理审计系统imo.php存在命令执行漏洞(CNVD-2025-07703)
  • hive 笔记
  • JAVA运算符详解
  • 实验设计与分析(第6版,Montgomery)第3章单因子实验:方差分析3.11思考题3.4 R语言解题
  • 如何彻底禁用WordPress中的评论
  • 12. CSS 布局与样式技巧
  • [ Qt ] | 常见控件(二): window相关
  • dede网站源码打包下载/网页设计与制作模板
  • 重庆的网站建设/网站关键词搜索排名
  • 公司要搭建网站/互联网项目推广平台有哪些
  • 做电影网站解决版权问题/正规专业短期培训学校
  • 捡个杀手做老婆在哪个网站发布的/电脑优化
  • 浙江省网站建设公司/网站关键词推广价格