Go程序例子(24):泛型
Go程序例子(24):泛型
从 Go 1.18 版本开始,Go 增加了对泛型的支持,也称为类型参数(type parameters)。代码语言:go复制package main
import "fmt"
// 以下是一个泛型函数的示例:SlicesIndex 接受一个任意可比较类型的切片 s 和该类型的一个元素 v,返回 v 在 s 中首次出现的索引,如果不存在则返回 -1。
Go程序例子(24):泛型
从 Go 1.18 版本开始,Go 增加了对泛型的支持,也称为类型参数(type parameters)。
代码语言:go复制package main
import "fmt"
// 以下是一个泛型函数的示例:SlicesIndex 接受一个任意可比较类型的切片 s 和该类型的一个元素 v,返回 v 在 s 中首次出现的索引,如果不存在则返回 -1。comparable 约束表示我们可以使用 == 和 != 操作符对这种类型的值进行比较。完整的类型签名详细解释可以参考相关博客文章。需要注意的是,标准库中已经提供了类似的实现,即 slices.Index。
func SlicesIndex[S ~[]E, E comparable](s S, v E) int {
for i := range s {
if v == s[i] {
return i
}
}
return -1
}
// 以下是一个泛型类型的示例:List 是一个单链表(singly-linked list),其中的值可以是任意类型。
type List[T any] struct {
head, tail *element[T]
}
type element[T any] struct {
next *element[T]
val T
}
// 我们可以像为普通类型定义方法一样为泛型类型定义方法,但需要保留类型参数。类型是 List[T],而不是简单的 List。这确保了方法能够正确地识别泛型参数并应用到具体的类型上。
func (lst *List[T]) Push(v T) {
if == nil {
lst.head = &element[T]{val: v}
= lst.head
} else {
.next = &element[T]{val: v}
= .next
}
}
// AllElements 返回所有列表元素作为切片。在下一个示例中,我们将看到一种更符合 Go 语言习惯的方式,用于遍历自定义类型的所有元素。
func (lst *List[T]) AllElements() []T {
var elems []T
for e := lst.head; e != nil; e = {
elems = append(elems, e.val)
}
return elems
}
func main() {
var s = []string{"foo", "bar", "zoo"}
// 在调用泛型函数时,我们通常可以依赖类型推断。请注意,在调用 SlicesIndex 时,我们不需要指定 S 和 E 的类型——编译器会自动推断它们。
fmt.Println("index of zoo:", SlicesIndex(s, "zoo"))
// … 当然,我们也可以显式地指定它们。
_ = SlicesIndex[[]string, string](s, "zoo")
lst := List[int]{}
lst.Push(10)
lst.Push(1)
lst.Push(2)
fmt.Println("list:", lst.AllElements())
}
运行结果:
代码语言:javascript代码运行次数:0运行复制$ go run generics.go
index of zoo: 2
list: [10 1 2]
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
上传时间: 2025-07-28 03:26:11
上一篇:知识图谱入门
推荐阅读
留言与评论(共有 7 条评论) |
本站网友 沙谷 | 12分钟前 发表 |
v} = .next } } // AllElements 返回所有列表元素作为切片 | |
本站网友 于冠华 | 23分钟前 发表 |
_ = SlicesIndex[[]string | |
本站网友 2016年11月汽车销量排行榜 | 25分钟前 发表 |
也称为类型参数(type parameters) | |
本站网友 吕厝 | 0秒前 发表 |
v E) int { for i | |
本站网友 崔珂 | 7分钟前 发表 |
也称为类型参数(type parameters) | |
本站网友 电影怎么下载 | 12分钟前 发表 |
fmt.Println("index of zoo |