Go泛型编程实战从类型约束到泛型数据结构
Go泛型编程实战从类型约束到泛型数据结构的完整指南文章导语Go 1.18引入了期待已久的泛型。两年多来泛型已从新特性变为日常开发的标配。本文从类型约束到泛型数据结构覆盖泛型在实际项目中的核心应用。一、类型约束定义// 内置约束funcMax[T constraints.Ordered](a,b T)T{ifab{returna}returnb}// 自定义约束typeNumberinterface{~int|~int32|~int64|~float32|~float64}funcSum[T Number](nums[]T)T{vartotal Tfor_,n:rangenums{totaln}returntotal}二、泛型数据结构// 泛型StacktypeStack[T any]struct{items[]T}func(s*Stack[T])Push(item T){s.itemsappend(s.items,item)}func(s*Stack[T])Pop()(T,bool){iflen(s.items)0{varzero Treturnzero,false}item:s.items[len(s.items)-1]s.itemss.items[:len(s.items)-1]returnitem,true}// 泛型SettypeSet[T comparable]map[T]struct{}funcNewSet[T comparable]()Set[T]{returnmake(Set[T])}func(s Set[T])Add(item T){s[item]struct{}{}}func(s Set[T])Contains(item T)bool{_,ok:s[item];returnok}三、实战泛型RepositorytypeRepository[T any,ID comparable]interface{FindByID(id ID)(T,error)Save(entity T)errorDelete(id ID)error}四、全文总结类型约束定义泛型参数的行为边界~T匹配底层类型为T的所有命名类型泛型数据结构减少类型转换代码避免过度抽象只在确实需要多类型支持时用泛型参考文献Go Blog - An Introduction To GenericsGo泛型设计提案Go 1.18 Release Notes