我有两个 struct ,它们具有相同的字段名和类型:

type JOURNAL_TAG struct {
    DATE_START            time.Time
    DATE_END              time.Time
    ENTRY_NUMBER          uint
    VALUE                 float64
}

type INVENTORY_TAG struct {
    DATE_START   time.Time
    DATE_END     time.Time
    PRICE        float64
    QUANTITY     float64
    ACCOUNT_NAME string
}

我有一个func,可以访问公共字段DATE_START,它应该对这些类型的切片进行排序:

func sort_by_time[t JOURNAL_TAG|INVENTORY_TAG](slice []t, is_ascending bool) {
    sort.Slice(slice, func(i, j int) bool {
        return slice[i].DATE_START.After(slice[j].DATE_START) == is_ascending
    })
}

运行go build会报告编译器错误:

slice[i].DATE_START undefined (type t has no field or method DATE_START)

我想用泛型对这两种类型的切片进行排序,可以吗?

我用的是围棋1.18.

推荐答案

Go 1.18 release notes人中:

Go编译器不支持访问 struct 字段x.f,其中x是类型参数类型,即使类型参数的类型集中的所有类型都有字段f.我们可以在Go 1.19中删除此限制.

例如,您可以向每个返回DATE_START字段的 struct 添加DateStart() time.Time方法,然后如果您想使用泛型,可以将该方法作为type constraint的一部分使用.

也就是说,这个特定问题不需要泛型.即使没有泛型,也可以定义一个接口:

type SomeInterface interface {
    DateStart() time.Time
}

然后排序:

items := []SomeInterface{
    INVENTORY_TAG{...},
    INVENTORY_TAG{...},
}
sort.Slice(items, func(i, j int) bool { return items[i].DateStart().Before(items[j].DateStart()) })

Go相关问答推荐

Go:嵌入类型不能是类型参数""

如何在另一个文件夹中使用Delve运行二进制文件?

有没有办法通过Go cmdline或IDE(IntelliJ)找出我的 struct 实现了什么接口?

如何将GoFr筛选器用于查询参数?

带有一个新变量的Go冒号等于运算符

Golang:访问any类型泛型上的字段

是否需要手动调用rand.Seed?

我应该先解锁然后再广播吗?

杜松子wine 和中间件

io.Reader 无限循环与 fmt.Fscan

Go Template if 条件

由于 main.go 文件中的本地包导入导致构建 docker 容器时出错

为什么互斥量比 golang 中的通道慢?

查找、解析和验证邮箱地址

Go lang - 惯用的默认后备

Go:为一组单个结果实现 ManyDecode

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

即使没有竞争条件也没有得到任何输出

如何使用通用字段初始化匿名struct数组

Golang 查询扫描未将查询正确扫描到 struct 中