亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在Go中訂購不同結構類型的列表

如何在Go中訂購不同結構類型的列表

Go
翻閱古今 2021-05-06 18:13:45
我只和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來保存您的類型值。

您可能需要檢查包“時間”和“排序”以簡化實現。


查看完整回答
反對 回復 2021-05-17
?
慕碼人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()。


查看完整回答
反對 回復 2021-05-17
  • 2 回答
  • 0 關注
  • 288 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號