如何在Go中訂購不同結(jié)構(gòu)類型的列表
我只和Go合作了幾天。我定義了各種不同的結(jié)構(gòu)類型,每種類型都包含一個日期。我需要以某種方式按日期順序處理這些結(jié)構(gòu),但是該順序必須跨越多個不同的結(jié)構(gòu)類型。在像Python這樣的動態(tài)類型化語言中,很容易為所有以日期為鍵的對象創(chuàng)建一個哈希(如果不是唯一的,則創(chuàng)建列表的哈希)。在C語言中,我可以使用指針或void *的并集。但是我對Go中如何執(zhí)行此操作感到困惑。我想我可以保留每種類型的排序列表,并在進(jìn)行時進(jìn)行手動mergesort。似乎笨拙?我所讀到的有關(guān)處理這種情況的內(nèi)容似乎指向使用接口,但是我并沒有真正看到如何在這種情況下使用它們。為了爭辯,假設(shè)我有類似的東西:type A struct { Date string Info string}type B struct { Date string Info int}(盡管實(shí)際上有更多的結(jié)構(gòu),并且它們在多個字段中更為復(fù)雜),并且只需要按日期順序打印每個(未排序)數(shù)組的內(nèi)容。有什么方法可以創(chuàng)建對非統(tǒng)一對象類型的列表(日期,指針)對?根據(jù)下面的第一個建議: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的創(chuàng)建非常丑陋。我看不到更干凈/更慣用的方式嗎?
查看完整描述