我只和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来保存您的类型值。
您可能需要检查包“时间”和“排序”以简化实现。
慕码人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()。
- 2 回答
- 0 关注
- 245 浏览
添加回答
举报
0/150
提交
取消