You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go中进一步约束类型参数:实现带Contains方法的泛型List

兼顾不可比类型与可比类型方法的泛型List实现

你可以通过Go 1.21+引入的where子句特性,在不修改基础List[T any]约束的前提下,为满足comparable条件的元素类型单独实现Contains方法,完美兼顾两种需求。

实现方案

首先保持基础的泛型List定义,支持所有任意类型:

package main

import "fmt"

type List[T any] []T

// 基础通用方法
func (l *List[T]) Len() int {
    return len(*l)
}

func (l *List[T]) Get(pos int) (T, error) {
    if pos < 0 || pos >= l.Len() {
        var zero T
        return zero, fmt.Errorf("index out of range: %d", pos)
    }
    return (*l)[pos], nil
}

func (l *List[T]) Append(t ...T) {
    *l = append(*l, t...)
}

// 其他通用方法如Set、Insert、Remove等...

然后使用where子句,为元素类型满足comparable的List添加Contains方法:

// 仅当T为可比类型时,该方法才会被编译
func (l *List[T]) Contains(t T) bool where T comparable {
    for _, s := range *l {
        if s == t {
            return true
        }
    }
    return false
}

方案优势

  • 兼容性保留:List[T any]依然可以存储不可比类型(比如自定义结构体、切片等),所有通用方法正常可用
  • 方法自动适配:当T是可比类型(如int、string、自定义可比结构体)时,Contains方法会自动成为List的成员方法,直接通过.调用即可
  • API一致性:不需要拆分不同的List类型,避免了类型转换的繁琐,保持代码风格统一

兼容旧版本Go(1.21以下)

如果你的项目还在使用Go 1.21之前的版本,可以通过类型别名的方式实现类似效果:

// 定义基于可比类型的List别名
type ComparableList[T comparable] List[T]

// 为别名实现Contains方法
func (l *ComparableList[T]) Contains(t T) bool {
    for _, s := range *l {
        if s == t {
            return true
        }
    }
    return false
}

使用时可以通过类型转换切换:

func main() {
    // 创建存储int的List
    var nums List[int]
    nums.Append(1,2,3)
    
    // 转换为ComparableList调用Contains
    cmpList := ComparableList[int](nums)
    fmt.Println(cmpList.Contains(2)) // 输出true
}

内容的提问来源于stack exchange,提问作者Jordan Barrett

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 17:52:54