Go 1.18 起的类型参数让“写一次、跑多型”成为可能,但关键是约束与边界。示例:把 min
应用于有序数值,同时支持 ~
派生底层类型;并展示切片去重的可组合写法。
package main
import "constraints"
type Ordered interface {
constraints.Ordered | ~int32 | ~int64
}
func Min[T Ordered](a, b T) T {
if a < b { return a }
return b
}
func Dedup[T comparable](xs []T) []T {
m := make(map[T]struct{}, len(xs))
out := xs[:0]
for _, v := range xs {
if _, ok := m[v]; !ok {
m[v] = struct{}{}
out = append(out, v)
}
}
return out
}
实践建议:1)优先使用标准库 constraints
;2)避免过度抽象,保持 API 简短;