分析golang的slice排序

2021-08-10 01:37:10 字數 1443 閱讀 9899

今天寫**,牽扯到給乙個slice排序的問題,發現go的sort包裡支援自定義排序,果斷拿來用了。

sort.slice(pricelist, func(i, j int) bool )
上面這個是使用sort.slice()的例子。

在此之前,先講講基礎的sort方法,

type

inte***ce inte***ce

func

sort(data

inte***ce)

func quicksort(data

inte***ce, a, b, maxdepth int)

我們發現,要實現sort排序,我們需要實現sort介面的三個方法,分別是len()less(i, j int) bool,和swap(i, j int)。這三個方法的注釋上面都有,我就不解釋了。它接收inte***ce介面,拿到了inte***ce介面,就可以去呼叫實現了這個介面的型別所對應的三個方法。sort方法內部會去調乙個快排演算法,既然是快排演算法,裡面肯定用到了less和swap,所以內部實現就不貼出來了。所以針對一般的sort.sort(某個切片),使用例子如下:

type person struct 

type personslice person

func (a personslice) len() int

func (a personslice) swap(i, j int)

func (a personslice) less(i, j int) bool

func main() ,

, ,

, }sort.sort(personslice(people)) // 按照 age 的逆序排序,引數傳遞給介面

fmt.println(people)

接下來講乙個更高效的,那就是sort.slice()方法了,

sort.slice(pricelist, func(i, j int) bool )//使用

func slice(slice inte***ce{}, less func(i, j int) bool) , 0, length, maxdepth(length))

}//原始碼

如上所述,我直接寫乙個less函式作為函式物件傳給slice方法,這裡其實相當於callback的思想了,然後swap和len方法系統幫我自動實現,len就是我的第乙個引數的長度,swap用系統預設的交換演算法,這樣我就高效的編寫了乙個可以由我自己來定義排序順序的struct切片排序,不僅簡潔優雅,**量小,而且容易被人理解,真是又一次體會到了go的魅力。

golang 陣列 slice 亂序

陣列亂序 方法1.sliceoutoforder 選定隨機數r 將下標r和下邊i交換,i 就是和當前最後一位交換 方法2.rand.perm 陣列長度 將原陣列下標按照隨機出來的資料賦值給另一陣列 package main import fmt import math rand import tim...

golang筆記 Slice切片

sliceslice代表變長的序列,序列中每個元素都有相同的型別。語法和陣列很像,只是沒有固定長度。引用型別 動態陣列 從概念上來說,slice像乙個結構體,這個結構體包含了三個元素 乙個指標,指向陣列中slice指定的開始位置 長度,即slice的長度 最大長度,也就是slice開始位置到陣列的最...

golang學習筆記 slice

go 語言中的slice型別可以理解為是陣列array型別的描述符,包含了三個因素 指向底層陣列的指標 slice目前使用到的底層陣列的元素個數,即長度 底層陣列的最大長度,即容量 因此當我們定義乙個切片變數,s make int,5,10 即為指向了乙個最大長度為10的底層陣列,目前切片s使用到的...