golang泛型
在Go语言中,泛型(Generics)是在Go 1.18版本中引入的一个新特性。泛型允许你编写可以处理多种数据类型的代码,而不需要在每种数据类型上重复编写相同的逻辑。这使得代码更加简洁和易于维护。
以下是一些关于Go语言泛型的基本概念和示例:
你可以定义一个泛型函数,使其能够处理多种数据类型。例如:
package main
import "fmt"
// 定义一个泛型函数,使用类型参数 T
func Print[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
func main() {
Print([]string{"Hello", "World"})
Print([]int{1, 2, 3})
}
在这个例子中,Print
函数可以处理任何类型的切片。
你也可以定义泛型类型。例如:
package main
import "fmt"
// 定义一个泛型类型 Stack
type Stack[T any] []T
// 定义泛型类型的方法
func (s *Stack[T]) Push(v T) {
*s = append(*s, v)
}
func (s *Stack[T]) Pop() T {
if len(*s) == 0 {
panic("stack is empty")
}
v := (*s)[len(*s)-1]
*s = (*s)[:len(*s)-1]
return v
}
func main() {
var s Stack[int]
s.Push(10)
s.Push(20)
fmt.Println(s.Pop()) // 输出 20
fmt.Println(s.Pop()) // 输出 10
}
在这个例子中,Stack
类型可以处理任何类型的元素。
你可以使用类型约束来限制泛型参数的类型。例如:
package main
import "fmt"
// 定义一个类型约束
type Number interface {
int | float64
}
// 定义一个泛型函数,使用类型约束
func Sum[T Number](s []T) T {
var sum T
for _, v := range s {
sum += v
}
return sum
}
func main() {
fmt.Println(Sum([]int{1, 2, 3})) // 输出 6
fmt.Println(Sum([]float64{1.5, 2.5})) // 输出 4.0
}
在这个例子中,Sum
函数只能处理int
和float64
类型的切片。
Go语言的泛型特性为开发者提供了更强大的工具来编写可重用和类型安全的代码。通过使用泛型函数、泛型类型和类型约束,你可以编写更加灵活和高效的代码。