我只和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 關注
- 288 瀏覽
添加回答
舉報
0/150
提交
取消