Go 泛型的工程化用法:约束、推断与零成本抽象

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 简短;3)热路径用 go test -bench 验证无逃逸、无反射;4)当类型行为不同(如 I/O)时用接口,数值/容器才用泛型。


评论 0