Skip to content
鼓励作者:欢迎打赏犒劳

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

如有转载或 CV 的请标注本站原文地址