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
相关推荐
平头哥AI12 小时前
Day 01 | go run 跑通第一个 Go 程序,go build 留下一个能拷走的 exe
开发语言·后端·golang
2601_9622965113 小时前
如何使用Golang包路径_管理本地和远程模块引用
golang·数据转换·变量定义·常用库·编程语言区别
FfHUCisI18 小时前
GMP 调度器:Go 并发的心脏是如何跳动的
开发语言·golang·php
我不会起名字32218 小时前
一天一道算法题(26):栈的简单应用
java·数据结构·python·算法·leetcode·golang·
gsls20080819 小时前
告别 Vault 的复杂度:用 Go 标准库给 Windows 凭据管理器装上 MCP
windows·golang·mcp
名字还没想好☜20 小时前
Go 时间格式化为什么用 2006-01-02:time.Format/Parse 的参考时间、时区与解析踩坑
开发语言·后端·golang·go
FfHUCisI1 天前
Golang Map 哈希表实现
golang·哈希算法·散列表
源代码•宸1 天前
前置准备:定时微服务背景和现状
开发语言·经验分享·后端·微服务·云原生·架构·golang
李燚2 天前
把规则搬回家:三个 BC 的贫血→充血重构实录(第103篇)
golang·agent·ddd·领域驱动设计·eino·deepflux·eino adk
astronautyi2 天前
Go 运行时内存分配与 GC 位图深度剖析
开发语言·后端·golang