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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何在 Go 1.18 中訪問泛型結(jié)構(gòu)中的共享字段?我收到錯(cuò)誤“類型 t 沒有字段或方法

如何在 Go 1.18 中訪問泛型結(jié)構(gòu)中的共享字段?我收到錯(cuò)誤“類型 t 沒有字段或方法

Go
慕哥6287543 2022-11-23 16:00:45
我有兩個(gè)結(jié)構(gòu),它們具有一些相同的字段名稱和類型:type JOURNAL_TAG struct {    DATE_START            time.Time    DATE_END              time.Time    ENTRY_NUMBER          uint    VALUE                 float64}type INVENTORY_TAG struct {    DATE_START   time.Time    DATE_END     time.Time    PRICE        float64    QUANTITY     float64    ACCOUNT_NAME string}我有一個(gè)訪問公共字段的函數(shù),該字段DATE_START應(yīng)該對(duì)這些類型的切片進(jìn)行排序:func sort_by_time[t JOURNAL_TAG|INVENTORY_TAG](slice []t, is_ascending bool) {    sort.Slice(slice, func(i, j int) bool {        return slice[i].DATE_START.After(slice[j].DATE_START) == is_ascending    })}運(yùn)行g(shù)o build報(bào)編譯錯(cuò)誤:slice[i].DATE_START undefined (type t has no field or method DATE_START)我想使用泛型對(duì)這兩種類型的切片進(jìn)行排序,可以嗎?我正在使用 1.18。
查看完整描述

2 回答

?
滄海一幻覺

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超5個(gè)贊

來自Go 1.18 發(fā)行說明:


Go 編譯器不支持訪問結(jié)構(gòu)字段 xf,其中 x 是類型參數(shù)類型,即使類型參數(shù)的類型集中的所有類型都有字段 f。我們可能會(huì)在 Go 1.19 中移除此限制。


例如,您可以向返回 DATE_START 字段的每個(gè)結(jié)構(gòu)添加一個(gè)DateStart() time.Time方法,然后如果您想使用泛型,則將該方法用作類型約束的一部分。


也就是說,您不需要針對(duì)此特定問題的泛型。即使沒有泛型,您也可以定義一個(gè)接口:


type SomeInterface interface {

    DateStart() time.Time

}

然后排序:


items := []SomeInterface{

    INVENTORY_TAG{...},

    INVENTORY_TAG{...},

}

sort.Slice(items, func(i, j int) bool { return items[i].DateStart().Before(items[j].DateStart()) })


查看完整回答
反對(duì) 回復(fù) 2022-11-23
?
MMMHUHU

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊

在這種情況下最好使用接口實(shí)現(xiàn),但如果你想嘗試泛型,你可以這樣做:


package main


type JOURNAL_TAG struct {

    DATE_START            time.Time

    DATE_END              time.Time

    ENTRY_NUMBER          uint

    VALUE                 float64

}


type INVENTORY_TAG struct {

    DATE_START   time.Time

    DATE_END     time.Time

    PRICE        float64

    QUANTITY     float64

    ACCOUNT_NAME string

}


type hasDateInterface interface {

    DateStart() time.Time

}


func (j JOURNAL_TAG) DateStart(){

   return j.DATE_START

}


func (i INVENTORY_TAG) DateStart(){

   return i.DATE_START

}


func sort_by_time[t hasDateInterface](slice []t, is_ascending bool) {

    sort.Slice(slice, func(i, j int) bool {

        return slice[i].DATE_START.After(slice[j].DateStart()) == is_ascending

    })

}


試過 https://go.dev/play/p/Xak4uzCNhE-


查看完整回答
反對(duì) 回復(fù) 2022-11-23
  • 2 回答
  • 0 關(guān)注
  • 172 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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