今天寫**,牽扯到給乙個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使用到的...