您现在的位置是:首页 > 编程 > 

Go程序例子(24):泛型

2025-07-28 06:23:44
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组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1256923.html

相关标签:无
上传时间: 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