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
相关推荐
FfHUCisI3 小时前
Golang - 信号量模式(Semaphore Pattern)
开发语言·后端·golang
报错小能手7 小时前
Go 语言结构 基础语法
开发语言·后端·golang
剩下了什么7 小时前
go语言 Ctx:「错误三:在 Context 中存储可变值」
开发语言·后端·golang
运维开发笔记8 小时前
3.7 Go panic 与 recover 学习笔记
golang
JavaPub-rodert9 小时前
我把 OpenAI 协议塞进了 Go 工具库:go-commons 开始支持 AI 了
开发语言·人工智能·golang
圣殿骑士-Khtangc1 天前
Go错误处理最佳实践进阶从error到panic的完整指南
golang
运维开发笔记1 天前
3.6 Go defer 语句学习笔记
golang
FfHUCisI1 天前
Golang HTTP 路由设计与请求处理
开发语言·http·golang
存在morning1 天前
【Python 开发实践 一】Python vs Go vs Java 三门语言对比
java·python·golang