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

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

按 go lang 中的動態字段排序

按 go lang 中的動態字段排序

Go
慕村225694 2022-01-17 18:23:07
所以我正在努力弄清楚如何通過“狀態”字段(asc,desc)對以下結構進行排序type CampaignStatus struct {    Campaign CampaignData    Status   string `json:"status" bson:"status"`}type CampaignsPagination struct {    Pagination PageMetadata  `json:"pagination"`    Campaigns  []CampaignStatus `json:"campaigns"`}完整廣告系列分頁的示例 json:   "pagination": {        "page": 1,        "per_page": 15,        "page_count": 1,        "total_count": 4    },    "campaigns": [        {            "Campaign": {                "_id": "57597fc6799e0fe41d0eede6",                "name": "Test campaign",                "description": "Just test campaign"                "isEmail": true            },            "status": "expired"        },        ...    }所以我的函數是 retuting 變量 ret := &CampaignsPagination{} 它填充了來自 mongoDB 的數據,但狀態由其他東西實時確定。因此,反射包說我正在嘗試對 *CampaignsPagination 類型進行排序,而我使用的所有內容幾乎都以諸如“類型 CampaignsPagination 不支持索引”之類的錯誤結束(使用排序包)任何提示都更受歡迎更新:我如何嘗試對此進行排序(但由于(類型 *CampaignsPagination 不支持索引而無法編譯)func (a *CampaignsPagination) Len() int {    return len(a)}func (a *CampaignsPagination) Swap(i, j int) {    a[i], a[j] = a[j], a[i]}func (a *CampaignsPagination) Less(i, j int) bool {    if a[i].Status < a[j].Status {        return true    }    if a[i].Status > a[j].Status {        return false    }    return a[i].Status < a[j].Status}
查看完整描述

2 回答

?
慕姐8265434

TA貢獻1813條經驗 獲得超2個贊

通常排序是在切片上定義的。您嘗試在CampaignsPagination結構類型上定義排序。


也可以這樣做,但有點不尋常(例如,如果您決定要根據另一個字段進行另一個訂單,您會怎么做?)。由于您的接收器a不是一個切片,而是一個(指向一個)包裝器結構的指針,因此在索引和返回長度時,請使用切片a.Campaigns。值也是string可比較的和有序的(按字節順序)。因此,您可以簡單地比較CampaignStatus.Status值并以Less().


func (a *CampaignsPagination) Len() int {

    return len(a.Campaigns)

}

func (a *CampaignsPagination) Swap(i, j int) {

    a.Campaigns[i], a.Campaigns[j] = a.Campaigns[j], a.Campaigns[i]

}

func (a *CampaignsPagination) Less(i, j int) bool {

    return a.Campaigns[i].Status < a.Campaigns[j].Status

}

更合乎邏輯的解決方案是在切片上定義排序,例如:


type CampaignStatusSort []CampaignStatus


func (c CampaignStatusSort) Len() int { return len(c) }


func (c CampaignStatusSort) Swap(i, j int) { c[i], c[j] = c[j], c[i] }


func (c CampaignStatusSort) Less(i, j int) bool { return c[i].Status < c[j].Status }

然后如果你有一個 type 的值*CampaignsPagination,你可以像這樣對活動進行排序:


cp := &CampaignsPagination{} // Init struct


sort.Sort(CampaignStatusSort(cp.Campaigns))


查看完整回答
反對 回復 2022-01-17
?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

CampaignsPagination和之間沒有一對一的關系Status。CampaignsPagination有一片CampaignStatus作為字段;手段CampaignsPagination有很多Statuses。


所以我假設您要對字段進行排序Campaigns []CampaignStatus。您的代碼幾乎是正確的;用于CampaignsPagination實現接口sort.Interface:


func (x *CampaignsPagination) Len() int {

    return len(x.Campaigns)

}

func (x *CampaignsPagination) Swap(i, j int) {

    a := x.Campaigns

    a[i], a[j] = a[j], a[i]

}

func (x *CampaignsPagination) Less(i, j int) bool {

    a := x.Campaigns

    if a[i].Status < a[j].Status {

        return true

    }

    if a[i].Status > a[j].Status {

        return false

    }

    return a[i].Status < a[j].Status

}

但是引入可排序類型會更合乎邏輯:


type Statuses []CampaignStatus


func (a Statuses) Len() int {

    return len(a)

}

func (a Statuses) Swap(i, j int) {

    a[i], a[j] = a[j], a[i]

}

func (a Statuses) Less(i, j int) bool {

    if a[i].Status < a[j].Status {

        return true

    }

    if a[i].Status > a[j].Status {

        return false

    }

    return a[i].Status < a[j].Status

}

然后將其用作字段Campaigns:


type CampaignsPagination struct {

    Pagination PageMetadata `json:"pagination"`

    Campaigns  Statuses     `json:"campaigns"`

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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