第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在Go中訂購不同結(jié)構(gòu)類型的列表

如何在Go中訂購不同結(jié)構(gòu)類型的列表

Go
翻閱古今 2021-05-06 18:13:45
我只和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)建非常丑陋。我看不到更干凈/更慣用的方式嗎?
查看完整描述

2 回答

?
白衣染霜花

TA貢獻(xiàn)1796條經(jīng)驗 獲得超10個贊

使用方法(例如返回日期的getDate())定義接口(例如Dated)。然后讓所有結(jié)構(gòu)(A,B,C)實(shí)現(xiàn)Dated接口。然后,您可以定義use [] Dated來保存您的類型值。

您可能需要檢查包“時間”和“排序”以簡化實(shí)現(xiàn)。


查看完整回答
反對 回復(fù) 2021-05-17
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗 獲得超9個贊

您也許可以使用embedding。

您將定義一個僅包含日期的結(jié)構(gòu),然后將其嵌入其他結(jié)構(gòu)中。這樣,您只需要實(shí)現(xiàn)一次GetDate()。您還可以隨時擴(kuò)展Date結(jié)構(gòu),而無需修改其他結(jié)構(gòu)。

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

}

您現(xiàn)在可以在A,B和C上調(diào)用GetDate()。


查看完整回答
反對 回復(fù) 2021-05-17
  • 2 回答
  • 0 關(guān)注
  • 284 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號