Golang 中的泛型


Golang,也称为 Go,是一种流行的开源编程语言,以其简洁性和并发性而闻名。然而,它缺少其他现代编程语言具有的一个重要特性,那就是泛型。泛型允许程序员编写灵活、可重用的代码,这些代码可以在不牺牲类型安全性的情况下与不同的类型一起工作。在本文中,我们将探讨 Golang 中泛型的介绍、语法和示例。

Golang 中泛型的介绍

泛型是一种编写可以处理任何类型代码的方式,而不是局限于特定类型。换句话说,泛型允许您编写可以在不同类型上操作的函数或数据结构,从而使其更加灵活和可重用。

在 Go 1.18 之前,Golang 不支持泛型。但是,随着 Go 1.18 的发布,Golang 最终添加了对泛型的支持。这在 Golang 开发人员中一直是一个备受期待的功能,它使 Golang 更加接近已经拥有泛型的现代编程语言,例如 Java 和 C#。

Golang 中泛型的语法

Golang 中泛型的语法使用一个新的关键字 type,用于定义泛型类型参数。以下是一个示例 -

func swap[T any](x, y T) (T, T) {
   return y, x
}

在这个例子中,T 是类型参数,它使用 any 关键字定义。swap 函数接受两个参数 x 和 y,这两个参数都是 T 类型,并返回一个 T 类型值的元组。

any 关键字用于指定任何类型都可以用作类型参数。但是,您也可以使用约束将类型参数限制为特定的一组类型。以下是一个示例 -

示例

package main

import "fmt"

func find[T comparable](arr []T, val T) int {
   for i, v := range arr {
      if v == val {
         return i
      }
   }
   return -1
}

func main() {
   arr := []int{1, 2, 3, 4, 5}
   index := find(arr, 3)
   fmt.Println(index) // Output: 2

   arr2 := []string{"foo", "bar", "baz"}
   index2 := find(arr2, "bar")
   fmt.Println(index2) // Output: 1
}

输出

2
1

在这个例子中,T 是类型参数,它被限制为可比较的类型。find 函数接受一个 []T 类型的数组和一个 T 类型的值,并返回 val 在数组中第一次出现的索引,如果未找到 val 则返回 -1。

Golang 中泛型的示例

让我们看一些如何在 Golang 中使用泛型的示例。

示例 1:交换函数

package main

import "fmt"

func swap[T any](x, y T) (T, T) {
   return y, x
}

func main() {
   a, b := 1, 2
   a, b = swap(a, b)
   fmt.Println(a, b) // Output: 2 1
   
   c, d := "hello", "world"
   c, d = swap(c, d)
   fmt.Println(c, d) // Output: world hello
}

输出

2 1
world hello

示例 2:查找函数

package main

import "fmt"

func find[T comparable](arr []T, val T) int {
   for i, v := range arr {
      if v == val {
         return i
      }
   }
   return -1
}

func main() {
   arr := []int{1, 2, 3, 4, 5}
   index := find(arr, 3)
   fmt.Println(index) // Output: 2
   
   arr2 := []string{"foo", "bar", "baz"}
   index2 := find(arr2, "bar")
   fmt.Println(index2) // Output: 1
}

输出

2
1

在这个例子中,我们使用泛型定义了 find 函数。find 函数接受一个 []T 类型的数组和一个 T 类型的值,并返回 val 在数组中第一次出现的索引,如果未找到 val 则返回 -1。我们用不同的类型 int 和 string 调用 find 函数两次,它按预期工作,返回我们正在查找的值的索引。

结论

泛型是一个强大的特性,允许您在 Golang 中编写灵活且可重用的代码。随着 Go 1.18 中添加了泛型,Golang 在与其他已经拥有泛型的现代编程语言(如 Java 和 C#)的竞争中变得更加强大。泛型是您工具箱中的一款很棒的工具,您应该考虑在 Golang 项目中使用它们。

更新于:2023年4月18日

200 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告