为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Go中订购不同结构类型的列表

如何在Go中订购不同结构类型的列表

Go
翻阅古今 2021-05-06 18:13:45
我只和Go合作了几天。我定义了各种不同的结构类型,每种类型都包含一个日期。我需要以某种方式按日期顺序处理这些结构,但是该顺序必须跨越多个不同的结构类型。在像Python这样的动态类型化语言中,很容易为所有以日期为键的对象创建一个哈希(如果不是唯一的,则创建列表的哈希)。在C语言中,我可以使用指针或void *的并集。但是我对Go中如何执行此操作感到困惑。我想我可以保留每种类型的排序列表,并在进行时进行手动mergesort。似乎笨拙?我所读到的有关处理这种情况的内容似乎指向使用接口,但是我并没有真正看到如何在这种情况下使用它们。为了争辩,假设我有类似的东西:type A struct {    Date string    Info string}type B struct {    Date string    Info int}(尽管实际上有更多的结构,并且它们在多个字段中更为复杂),并且只需要按日期顺序打印每个(未排序)数组的内容。有什么方法可以创建对非统一对象类型的列表(日期,指针)对?根据下面的第一个建议:package mainimport "fmt"type A struct {    Date string    Info string}func (x *A) GetDate() string {    return x.Date}type B struct {    Date string    Info int}func (x *B) GetDate() string {    return x.Date}type Dater interface {    GetDate() string}type Daters []Daterfunc (s Daters) Len() int      { return len(s) }func (s Daters) Swap(i, j int) { s[i], s[j] = s[j], s[i] }type ByDate struct{ Daters }func (s ByDate) Less(i, j int) bool {    return s.Daters[i].GetDate() < s.Daters[j].GetDate()}   func main() {    // lista and listb are just examples. They really come from elsewhere    lista := []A{{"2012/08/01", "one"}, {"2012/08/03", "three"}}    listb := []B{{"2012/08/02", 2}, {"2012/08/04", 4}}    x := make([]Dater, len(lista) + len(listb))    index := 0    for i := range(lista) {        x[index] = &lista[i]        index++    }    for i := range(listb) {        x[index] = &listb[i]        index++    }    sort.Sort(ByDate{x})    for _,v := range(x) {        fmt.Printf("%#v\n", v)    }}这样可行!因此,接口的基本用法很好,并且我开始对接口有了更好的了解-谢谢!注意:x的创建非常丑陋。我看不到更干净/更惯用的方式吗?
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

使用方法(例如返回日期的getDate())定义接口(例如Dated)。然后让所有结构(A,B,C)实现Dated接口。然后,您可以定义use [] Dated来保存您的类型值。

您可能需要检查包“时间”和“排序”以简化实现。


查看完整回答
反对 回复 2021-05-17
?
慕码人2483693

TA贡献1860条经验 获得超9个赞

您也许可以使用embedding

您将定义一个仅包含日期的结构,然后将其嵌入其他结构中。这样,您只需要实现一次GetDate()。您还可以随时扩展Date结构,而无需修改其他结构。

package main


type Dater interface {

    GetDate() string

}


type Date struct {

    Date string

}


func (d *Date) GetDate() string {

    return d.Date

}


type A struct {

    Date

    Info string

}


type B struct {

    Date

    Info []byte

}


type C struct {

    Date

    Info int32

}

您现在可以在A,B和C上调用GetDate()。


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 245 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信