Go 语言泛型 — 泛型语法与示例

以下是Go语言中关于 Go 泛型 - 泛型语法与示例 的详解,适合泛型入门学习和实际开发使用:

一、什么是泛型(Generics)?

泛型是一种支持"类型参数"的机制,可以让函数、类型等支持多种数据类型,提高代码复用性。

Go 从 1.18 版本开始正式支持泛型,主要体现在:

  • • 泛型函数
  • • 泛型类型(结构体、接口等)
  • • 类型约束(constraints)

二、基本语法格式

泛型函数的声明

go 复制代码
func PrintSlice[T any](s []T) {
    for _, v := range s {
        fmt.Println(v)
    }
}
  • T 是类型参数。
  • [T any] 表示 T 可接受任意类型(anyinterface{} 的别名)。

泛型类型的声明

go 复制代码
type Stack[T any] struct {
    elements []T
}

func (s *Stack[T]) Push(v T) {
    s.elements = append(s.elements, v)
}

func (s *Stack[T]) Pop() T {
    l := len(s.elements)
    val := s.elements[l-1]
    s.elements = s.elements[:l-1]
    return val
}

三、多个类型参数

go 复制代码
func Compare[K comparable, V any](a map[K]V, b map[K]V) bool {
    if len(a) != len(b) {
        return false
    }
    for k, v := range a {
        if b[k] != v {
            return false
        }
    }
    return true
}
  • K comparable 限定 K 必须是可比较类型(如用于 map key)。
  • V any 无限制。

四、类型约束(Constraints)

使用接口作为约束

go 复制代码
type Addable interface {
    int | float64
}

func Sum[T Addable](a, b T) T {
    return a + b
}
  • • 类型集 int | float64 表示 T 可以是 intfloat64
  • Addable 是一个"约束接口"。

五、泛型实战示例

1. 泛型排序函数

css 复制代码
func Min[T constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}
  • constraints.Ordered 是标准库提供的类型约束,表示支持 < <= >= > 的类型。

2. 泛型 Map 函数(函数式编程)

go 复制代码
func Map[T any, R any](list []T, f func(T) R) []R {
    var result []R
    for _, v := range list {
        result = append(result, f(v))
    }
    return result
}

使用:

go 复制代码
squares := Map([]int{1, 2, 3}, func(x int) int { return x * x })
fmt.Println(squares) // [1 4 9]

六、类型推断

Go 支持自动类型推断:

c 复制代码
PrintSlice([]string{"a", "b", "c"})

也可以显式指定类型参数:

c 复制代码
PrintSlice[string]([]string{"a", "b"})

七、标准库中的泛型支持(Go 1.18+)

Go 1.18+ 在 golang.org/x/exp/constraints 提供了常用的类型约束:

css 复制代码
import "golang.org/x/exp/constraints"

func Max[T constraints.Ordered](a, b T) T {
    if a > b {
        return a
    }
    return b
}

八、使用建议

建议 说明
✅ 用于数据结构通用化 如 Stack、Queue、Map 等
✅ 用于通用算法封装 如排序、筛选、映射、聚合
⚠ 避免过度使用泛型 不如接口清晰时不必用泛型
✅ 配合类型约束 提高类型安全性与可读性

九、小结

  • • 泛型让 Go 支持了更高层次的抽象与复用,不再需要写多版本函数。
  • • 与接口并用,可构建健壮、通用的框架组件。
  • • 使用时注意性能与可读性的权衡。

相关推荐
再吃一根胡萝卜5 小时前
微服务治理的“四大护法”:从 Django 视角理解 Spring Cloud 核心组件
后端
再吃一根胡萝卜5 小时前
面试终极挑战:如何用 Django 经验,回答 Java 微服务实战问题?
后端
To_OC6 小时前
装完 ESLint 它一声不吭?我还以为代码写得多好
后端·node.js·eslint
凤山老林7 小时前
精细化流量治理:Spring Boot 动态特性开关与灰度发布体系
java·spring boot·后端
vipbic7 小时前
一个前端的 9 天重构:我是怎么用 Codex 重做航栈的
前端·javascript·后端
用户938515635078 小时前
TypeScript 高级类型 + CSS 三列布局:从类型体操到样式工程的进阶之路
css·面试·typescript
考虑考虑10 小时前
Excel导入时产生特殊字符处理
java·后端·java ee
Scabbards_10 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
IT_陈寒11 小时前
Redis的DEL命令竟然没删掉数据?我踩的这个坑你得知道
前端·人工智能·后端
黄敬峰11 小时前
🐳 Docker 从入门到实战:一次搞定容器化 + Nginx 反向代理
面试