我只和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的创建非常丑陋。我看不到更干净/更惯用的方式吗?
白衣染霜花
慕码人2483693
相关分类