2 回答

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))

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"`
}
- 2 回答
- 0 關注
- 174 瀏覽
添加回答
舉報