欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

Go 泛型实践:类型约束与泛型数据结构

发表于:|最后更新:|分类:后端开发|阅读:6004 次

Go 1.18 引入泛型,通过类型参数与类型约束实现代码复用,同时保持编译期类型安全。

一、类型约束定义

go
type Number interface {
    ~int | ~int64 | ~float64
}

func Sum[T Number](values []T) T {
    var total T
    for _, v := range values {
        total += v
    }
    return total
}

~ 表示底层类型匹配,允许自定义类型(如 type MyInt int)也满足约束。

二、泛型数据结构

go
type Stack[T any] struct {
    items []T
}

func (s *Stack[T]) Push(v T) {
    s.items = append(s.items, v)
}

func (s *Stack[T]) Pop() (T, bool) {
    var zero T
    if len(s.items) == 0 {
        return zero, false
    }
    v := s.items[len(s.items)-1]
    s.items = s.items[:len(s.items)-1]
    return v, true
}

泛型适合容器、算法与工具函数,但不应滥用;接口仍是对行为抽象的首选。