Go泛型编程实战从类型约束到泛型数据结构

Go泛型编程实战从类型约束到泛型数据结构的完整指南

文章导语

Go 1.18引入了期待已久的泛型。两年多来,泛型已从"新特性"变为日常开发的标配。本文从类型约束到泛型数据结构,覆盖泛型在实际项目中的核心应用。

一、类型约束定义

go 复制代码
// 内置约束
func Max[T constraints.Ordered](a, b T) T {
    if a > b { return a }
    return b
}

// 自定义约束
type Number interface {
    ~int | ~int32 | ~int64 | ~float32 | ~float64
}

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

二、泛型数据结构

go 复制代码
// 泛型Stack
type Stack[T any] struct {
    items []T
}

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

// 泛型Set
type Set[T comparable] map[T]struct{}

func NewSet[T comparable]() Set[T] { return make(Set[T]) }
func (s Set[T]) Add(item T)        { s[item] = struct{}{} }
func (s Set[T]) Contains(item T) bool { _, ok := s[item]; return ok }

三、实战:泛型Repository

go 复制代码
type Repository[T any, ID comparable] interface {
    FindByID(id ID) (T, error)
    Save(entity T) error
    Delete(id ID) error
}

四、全文总结

  1. 类型约束定义泛型参数的行为边界
  2. ~T匹配底层类型为T的所有命名类型
  3. 泛型数据结构减少类型转换代码
  4. 避免过度抽象:只在确实需要多类型支持时用泛型

参考文献

  1. Go Blog - An Introduction To Generics
  2. Go泛型设计提案
  3. Go 1.18 Release Notes
相关推荐
紧跟先前的步伐7 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
利威尔xu12 小时前
2026-11-05-Go内存管理面试
面试·golang
Zenova EdgeOS2 天前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
JavaPub-rodert2 天前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
microrain2 天前
SagooIoT 的数据接入层只有四张表,却能接住三种外部数据
物联网·golang·数据建模·sagooiot
fly-iot2 天前
【FDE知识库】(4):企业知识库怎么选型,开源知识库分享几个,选择开源协议友好的版本,开发wiki-go项目
golang·开源·开源协议
福大大架构师每日一题2 天前
excelize v2.11.1发布:Go 1.26.0起步,16项安全修复与嵌入对象能力全面升级
开发语言·安全·golang
小小龙学IT2 天前
Go 语言 pprof 性能剖析与调优深度解析:把“卡在哪“变成一张可执行的数据图
开发语言·后端·golang
十二同学啊3 天前
Go 工程化详解:项目结构、代码规范、测试体系与 CI/CD 实践
ci/cd·golang·代码规范
利威尔xu3 天前
Go IM 源码实战(14):本地缓存快 3000 倍,失效却难 10 倍
后端·缓存·微服务·面试·golang