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

我只和Go合作了几天。我定义了各种不同的结构类型,每种类型都包含一个日期。


我需要以某种方式按日期顺序处理这些结构,但是该顺序必须跨越多个不同的结构类型。在像Python这样的动态类型化语言中,很容易为所有以日期为键的对象创建一个哈希(如果不是唯一的,则创建列表的哈希)。在C语言中,我可以使用指针或void *的并集。但是我对Go中如何执行此操作感到困惑。


我想我可以保留每种类型的排序列表,并在进行时进行手动mergesort。似乎笨拙?


我所读到的有关处理这种情况的内容似乎指向使用接口,但是我并没有真正看到如何在这种情况下使用它们。


为了争辩,假设我有类似的东西:


type A struct {

    Date string

    Info string

}


type B struct {

    Date string

    Info int

}

(尽管实际上有更多的结构,并且它们在多个字段中更为复杂),并且只需要按日期顺序打印每个(未排序)数组的内容。


有什么方法可以创建对非统一对象类型的列表(日期,指针)对?


根据下面的第一个建议:


package main

import "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 []Dater

func (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的创建非常丑陋。我看不到更干净/更惯用的方式吗?


翻阅古今
浏览 246回答 2
2回答

白衣染霜花

使用方法(例如返回日期的getDate())定义接口(例如Dated)。然后让所有结构(A,B,C)实现Dated接口。然后,您可以定义use [] Dated来保存您的类型值。您可能需要检查包“时间”和“排序”以简化实现。

慕码人2483693

您也许可以使用embedding。您将定义一个仅包含日期的结构,然后将其嵌入其他结构中。这样,您只需要实现一次GetDate()。您还可以随时扩展Date结构,而无需修改其他结构。package maintype Dater interface {&nbsp; &nbsp; GetDate() string}type Date struct {&nbsp; &nbsp; Date string}func (d *Date) GetDate() string {&nbsp; &nbsp; return d.Date}type A struct {&nbsp; &nbsp; Date&nbsp; &nbsp; Info string}type B struct {&nbsp; &nbsp; Date&nbsp; &nbsp; Info []byte}type C struct {&nbsp; &nbsp; Date&nbsp; &nbsp; Info int32}您现在可以在A,B和C上调用GetDate()。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go