4

我只用 Go 工作了几天。我定义了少量不同的结构类型,每个都包含一个日期。

不知何故,我需要按日期顺序处理这些结构,但这种排序必须跨越多种不同的结构类型。在像 Python 这样的动态类型语言中,很容易创建所有按日期键入的对象的哈希(如果它们不是唯一的,则创建列表的哈希)。在 C 中,我可以使用指针联合或 void*。但我不知道如何在 Go 中做到这一点。

我想我可以保留每种类型的排序列表并随时进行手动合并排序。看起来很笨拙?

我读到的关于处理这种情况的内容似乎指向使用接口,但我真的不知道如何在这种情况下使用它们。

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

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 的创建非常丑陋。我看不到更清洁/更惯用的方式?

4

2 回答 2

3

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

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

于 2012-09-17T03:04:35.853 回答
0

您也许可以使用嵌入

您将定义一个只包含日期的结构,然后将其嵌入到其他结构中。这样,您只需执行一次 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()。

于 2012-09-17T07:11:24.800 回答