Z
ZHANK
进阶技巧

泛型

泛型函数/类型、constraints 约束、comparable/any、类型推断

泛型

Go 1.18 引入泛型——类型参数 + 约束(constraint)。用 anycomparable 两个内置约束解决大部分场景。

学完本章你将: 掌握泛型函数/类型、constraints、comparable/any。


泛型函数

go
package main

import "fmt"

// 泛型 Min——适用于所有可排序类型
func Min[T constraints.Ordered](a, b T) T {
    if a < b {
        return a
    }
    return b
}

func main() {
    fmt.Println(Min(3, 5))            // 5
    fmt.Println(Min(3.14, 2.72))     // 2.72
    fmt.Println(Min("abc", "abd"))   // "abc"
}

泛型类型

go
// 泛型集合
type Set[T comparable] map[T]struct{}

func NewSet[T comparable]() Set[T] {
    return make(Set[T])
}

func (s Set[T]) Add(v T) {
    s[v] = struct{}{}
}

func (s Set[T]) Contains(v T) bool {
    _, ok := s[v]
    return ok
}

常用约束

go
// any —— 任意类型(interface{} 的别名)
func Print[T any](v T) { fmt.Println(v) }

// comparable —— 可比较类型(== !=)
func Contains[T comparable](slice []T, item T) bool { }

// 自定义约束
type Number interface {
    ~int | ~int64 | ~float64  // ~ 支持底层类型
}

func Sum[T Number](nums []T) T {
    var total T
    for _, n := range nums {
        total += n
    }
    return total
}