
go泛型
初体验
go
package main
import "fmt"
// --------------------------
// 1. 泛型函数:打印任意类型的值
// --------------------------
func Print[T any](value T) {
fmt.Printf("Value: %v (Type: %T)\n", value, value)
}
// --------------------------
// 2. 泛型结构体:一个可以保存任意类型值的容器
// --------------------------
type Container[T any] struct {
Value T
}
// 为泛型结构体定义方法
func (c Container[T]) GetValue() T {
return c.Value
}
// --------------------------
// 3. 泛型切片操作:查找元素是否在切片中
// --------------------------
func Contains[T comparable](slice []T, item T) bool {
for _, v := range slice {
if v == item {
return true
}
}
return false
}
// --------------------------
// 主函数演示
// --------------------------
func main() {
// 使用泛型函数 Print
Print("Hello, Go泛型!") // 字符串
Print(42) // 整数
Print(3.14) // 浮点数
// 使用泛型结构体 Container
strContainer := Container[string]{Value: "泛型字符串"}
intContainer := Container[int]{Value: 100}
fmt.Println("字符串容器:", strContainer.GetValue())
fmt.Println("整数容器:", intContainer.GetValue())
// 使用泛型函数 Contains
numbers := []int{1, 2, 3, 4, 5}
fmt.Println("切片中是否包含 3?", Contains(numbers, 3)) // true
words := []string{"go", "rust", "java"}
fmt.Println("切片中是否包含 'go'?", Contains(words, "go")) // true
fmt.Println("切片中是否包含 'python'?", Contains(words, "python")) // false
}
自定义约束
这段代码的意思是:定义了一个名为 Number 的类型约束,只有 int, int32, int64, float32, float64 这些类型满足该约束,可以在泛型函数中使用。
go
// 定义一个接口作为类型约束
type Number interface {
int | int32 | int64 | float32 | float64
}
// 泛型函数:计算数字切片的总和
func Sum[T Number](numbers []T) T {
var total T
for _, n := range numbers {
total += n
}
return total
}
// 使用
fmt.Println("Sum:", Sum([]int{1, 2, 3, 4})) // 10
fmt.Println("Sum:", Sum([]float64{1.5, 2.5})) // 4.0