如何在 Go 1.18 中访问泛型结构中的共享字段?我收到错误“type t has no field or method DATE_START”[重复]

2024-01-06

我有两个具有一些相同字段名称和类型的结构:

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
}

我有一个访问公共字段的函数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
    })
}

Running go build报告编译器错误:

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

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

我正在使用 go 1.18。


来自Go 1.18 发行说明 https://tip.golang.org/doc/go1.18#generics:

Go 编译器不支持访问结构体字段 x.f,其中 x 属于类型参数类型,即使类型参数类型集中的所有类型都有字段 f。我们可能会在 Go 1.19 中删除此限制。

例如,您可以添加一个DateStart() time.Time方法到返回 DATE_START 字段的每个结构,然后使用该方法作为您的类型约束 https://go.dev/doc/tutorial/generics#declare_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()) })
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Go 1.18 中访问泛型结构中的共享字段?我收到错误“type t has no field or method DATE_START”[重复] 的相关文章

随机推荐