已知一個的struct組成的數組,如今要按照數組中的一個字段排序。python有sort方法,那golang要怎麼實現呢?其實golang也有sort方法,而且使用簡單,功能強大。python
咱們先看一下sort.Sort()的源碼golang
func Sort(data Interface) { // Switch to heapsort if depth of 2*ceil(lg(n+1)) is reached. n := data.Len() maxDepth := 0 for i := n; i > 0; i >>= 1 { maxDepth++ } maxDepth *= 2 quickSort(data, 0, n, maxDepth) } func quickSort(data Interface, a, b, maxDepth int) { for b-a > 12 { // Use ShellSort for slices <= 12 elements if maxDepth == 0 { heapSort(data, a, b) return } maxDepth-- mlo, mhi := doPivot(data, a, b) // Avoiding recursion on the larger subproblem guarantees // a stack depth of at most lg(b-a). if mlo-a < b-mhi { quickSort(data, a, mlo, maxDepth) a = mhi // i.e., quickSort(data, mhi, b) } else { quickSort(data, mhi, b, maxDepth) b = mlo // i.e., quickSort(data, a, mlo) } } if b-a > 1 { // Do ShellSort pass with gap 6 // It could be written in this simplified form cause b-a <= 12 for i := a + 6; i < b; i++ { if data.Less(i, i-6) { data.Swap(i, i-6) } } insertionSort(data, a, b) } }
經過quickSort方法咱們看出,根據數據不一樣的情況,quickSort會選擇堆排,快排,插入排中更高效的排序方法,這個咱們暫時先不深究,先看如何使用sort.Sort()。json
從源碼中咱們發現數據data,須要自帶Len,Less,Swap三種方法,因此使用sort.Sort()前,咱們須要本身實現Len,Less,Swap來肯定按照什麼規則排序。數組
來實踐一下,咱們先建立一個結構體數組,結構體包含字段Count,咱們按照Count對其排序。app
package main import ( "sort" ) type subInfo struct { Count uint `json:"count"` } type SubList []*subInfo func (p SubList) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p SubList) Len() int { return len(p) } func (p SubList) Less(i, j int) bool { return p[i].Count > p[j].Count } func main() { st_list := SubList{} for i := 0; i < 10; i ++{ _sub := &subInfo{ Count: uint(i), } st_list = append(st_list, _sub) } sort.Sort(st_list) return }
須要注意的是,st_list只能初始化成SubList{},而不能初始化爲make([]*subInfo, 0),雖然他們結構是同樣的。ui
最近諸事不順,心煩的一匹,上週也拖更了,總之但願你們事事順心,心愛的人身體健康。this
但願對你們有所幫助~spa