我正在try 用Golang编写泛型函数,以类似的方式在切片和通道中搜索值.下面是一个例子:

// MinOf returns the smallest number found among the channel / slice contents
func MinOf[T chan int | []int](input T) (result int) {
    for _, value := range input {
        if result > value {
            result = value
        }
    }

    return
}

但我得到以下编译错误:cannot range over input (variable of type T constrained by chan int|[]int) (T has no core type).

我曾try 创建通用界面,如下所示:

type Rangable interface {
    chan int | []int
}

// MinOf returns the smallest number found among the channel / slice contents
func MinOf[T Rangable](input T) (result int) {
    for _, value := range input {
        if result > value {
            result = value
        }
    }

    return
}

虽然,误差已更改为cannot range over input (variable of type T constrained by Rangable) (T has no core type),但基本保持不变...

有没有办法使用泛型或通道和切片不能"强制转换"为相同的核心类型来解决此任务?

感谢您的任何建议和 idea !

推荐答案

你不能这么做.

开始时,range表达式必须是一个核心类型.具有不同类型术语的联合没有核心类型,因为没有一个共同的基础类型.

您还可以直观地看到为什么range需要核心类型:在切片和通道上范围的语义是不同的.

  1. 在信道上测距可能是一种阻塞操作,而在切片上测距则不是

  2. 迭代变量不同

for i, item := range someSlice {}

对于片i是类型int的索引,并且item是片元素的类型.

for item := range someChan {}

对于Channels,item是Chan元素的类型,这是唯一可能的范围变量.

您所能拥有的最好的是类型转换:

func MinOf[T any, U chan T | []T](input U) (result int) {
    switch t := any(input).(type) {
    case chan T:
        // range over chan
    case []T:
        // range over slice
    }
    return
}

但同样,该函数的行为(阻塞和非阻塞)依赖于类型,并且不清楚在这里使用泛型有什么好处.

Go相关问答推荐

Golang html/模板&需要错误数量的参数1在模板中使用';调用';获得0&q;

+在具有html/模板Golang的Base64中

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

如何使用GO GIN从Auth0 JWT内标识检索权限

无法在32位计算机上运行Golang应用程序

从使用Golang otelmux检测的Otel跟踪中获取trace_id

Golang SDK for DynamoDB:ReturnValuesOnConditionCheckFailure在条件chcek失败发生时不返回条件的详细信息

go中跨域自定义验证的问题

Go:为什么我不能比较 net.Addr

如何绕过深层 xml,没有嵌套循环?

优化方式中所有可能组合的字符串相似度

使用goroutines在Golang中验证 struct

git ls-remote 成功而 go get 失败

为什么 net/http 不遵守超过 30 秒的超时持续时间?

使用 unsafe.Pointer 将 struct point直接转换为另一个 struct 是否安全?

Gorm 预加载给出了模糊的列错误

不能在 *gorm.db 而不是 gorm.db 上使用 WithContext(ctx) 方法

为什么 go.mod 中的所有依赖都是间接的?

如何解决在mac m1中运行gcc失败退出状态1?

如何访问 Go 模板中数组的第一个索引的值