以下是一个包含 Golang 泛型代码示例的文件:
package main
import (
"fmt"
"sort"
)
// 泛型函数
func Add[T any](x, y T) T {
return x + y
}
func main() {
// 将两个整数相加
fmt.Println(Add(1, 2)) // 3
// 将两个字符串相加
fmt.Println(Add("Hello", "World")) // HelloWorld
// 泛型类型
type List[T any] []T
// 创建一个存储整数的列表
var intList List[int]
intList = []int{1, 2, 3}
// 创建一个存储字符串的列表
var strList List[string]
strList = []string{"Hello", "World"}
// 泛型约束
func Sort[T comparable](xs []T) {
sort.Slice(xs, func(i, j int) bool {
return xs[i] < xs[j]
})
}
// 使用泛型约束来排序整数列表
Sort(intList)
fmt.Println(intList) // [1 2 3]
// 使用泛型类型集合来简化泛型约束
func Sort[T int | string](xs []T) {
sort.Slice(xs, func(i, j int) bool {
return xs[i] < xs[j]
})
}
// 使用泛型类型集合来排序整数和字符串列表
Sort(strList)
fmt.Println(strList) // [Hello World]
}
该文件包含以下代码示例:
-
Add()
是一个泛型函数,可以将两个任意类型的值相加。 -
List()
是一个泛型类型,可以存储任意类型的值。 -
Sort()
是一个泛型函数,可以对任意类型的列表进行排序。
Golang 泛型是在 Go 1.18 中引入的新功能,允许我们在函数、类型和接口中使用类型参数。泛型可以帮助我们简化代码,提高代码的复用性和可维护性。
以下是一些 Golang 泛型代码示例:
泛型函数
泛型函数可以接受任意类型的参数。例如,以下函数可以将两个值相加,无论它们的类型是什么:
func Add[T any](x, y T) T {
return x + y
}
例如,我们可以使用该函数来将两个整数相加:
fmt.Println(Add(1, 2)) // 3
或将两个字符串相加:
fmt.Println(Add("Hello", "World")) // HelloWorld
泛型类型
泛型类型可以存储任意类型的值。例如,以下类型定义了一个泛型列表:
type List[T any] []T
我们可以使用该类型来创建一个存储整数的列表:
var intList List[int]
intList = []int{1, 2, 3}
或创建一个存储字符串的列表:
var strList List[string]
strList = []string{"Hello", "World"}
泛型约束
泛型约束可以用于限制类型参数的范围。例如,以下函数接受一个泛型函数,该函数接受两个 Comparable
类型的参数:
func Sort[T comparable](xs []T) {
sort.Slice(xs, func(i, j int) bool {
return xs[i] < xs[j]
})
}
Comparable
是一个接口,它只包含一个方法 Compare()
:
type Comparable interface {
Compare(other interface{}) int
}
该接口确保函数接受的泛型函数可以安全地对其参数进行比较。
泛型类型集合
泛型类型集合可以用于简化泛型约束的使用。例如,以下函数接受一个泛型函数,该函数接受两个 int
或 string
类型的参数:
func Sort[T int | string](xs []T) {
sort.Slice(xs, func(i, j int) bool {
return xs[i] < xs[j]
})
}
我们可以使用 int | string
来表示 int
和 string
的类型集合。
泛型最佳实践
在使用泛型时,需要注意以下最佳实践:
- 使用泛型可以简化代码,但也可能会使代码更加复杂。在使用泛型之前,请仔细考虑是否值得使用。
- 使用泛型约束可以限制类型参数的范围,从而确保代码的安全性。
- 使用泛型类型集合可以简化泛型约束的使用。
泛型是一种强大的新功能,可以帮助我们编写更简洁、更高效的 Go 代码。