Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法
最近開始實習(xí),工作技術(shù)棧主要Python和Golang,目前的任務(wù)把Python模塊重構(gòu)為GO模塊,然后出現(xiàn)了一個問題,就是要將一個結(jié)構(gòu)體按結(jié)構(gòu)體中各個字段進行排序,然后寫入Redis,對于Pyhon來說for循環(huán)就能解決,但是對于Go語言來說,每一次排序都要寫一個比較函數(shù),寫出來的代碼太丑,非常長,代碼結(jié)構(gòu)是一致,只是比較字段不一樣而已,個人無法接受啊,網(wǎng)上搜索也沒搜索到合適解決方法,所以自己想了一個解決方法來優(yōu)雅排序。
比較函數(shù):
func reflectCmp(i, j interface{}, fieldName string) bool { //按傳入fieldName 排序
valI := reflect.ValueOf(i).FieldByName(fieldName).Interface()
valJ := reflect.ValueOf(j).FieldByName(fieldName).Interface()
switch s := valI.(type) {
case string:
return s < valJ.(string)
case float64:
return s < valJ.(float64)
case int:
return s < valJ.(int)
default:
fmt.Println("The type is unknown")
}
return true
}
將自己要比較的類型加入switch中即可。
假設(shè)我們有一個結(jié)構(gòu)體為
type person struct {
Age int
Name string
}
那么如何來排序呢?
func main() {
pSlice := []person{{20,"a"},{15,"be"},{32,"cc"},{2,"aa"}}
var p person
typeOfA := reflect.TypeOf(p)
// 遍歷結(jié)構(gòu)體所有成員
for i := 0; i < typeOfA.NumField(); i++ {
// 獲取每個成員的結(jié)構(gòu)體字段類型
fieldType := typeOfA.Field(i)
sort.Slice(pSlice,func(i, j int) bool {
return reflectCmp(pSlice[i],pSlice[j],fieldType.Name)
})
fmt.Println(pSlice)
}
}
運行結(jié)果

利用反射,不管結(jié)構(gòu)體有多少個字段,我們都能用一個for 排序即可優(yōu)雅完成排序。
到此這篇關(guān)于Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的文章就介紹到這了,更多相關(guān)Golang反射結(jié)構(gòu)體排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
GoLang bytes.Buffer基礎(chǔ)使用方法詳解
Go標準庫中的bytes.Buffer(下文用Buffer表示)類似于一個FIFO的隊列,它是一個流式字節(jié)緩沖區(qū),我們可以持續(xù)向Buffer尾部寫入數(shù)據(jù),從Buffer頭部讀取數(shù)據(jù)。當Buffer內(nèi)部空間不足以滿足寫入數(shù)據(jù)的大小時,會自動擴容2023-03-03
GO語言創(chuàng)建錢包并遍歷錢包(wallet)的實現(xiàn)代碼
比特幣錢包實際上是一個密鑰對,當你安裝 一個錢包應(yīng)用,或者是使用一個比特幣客戶端來生成一個新地址是,他就會為你生成一個密鑰對,今天通過本文給大家分享go語言遍歷錢包的相關(guān)知識,一起看看吧2021-05-05
Golang 使用gorm添加數(shù)據(jù)庫排他鎖,for update
這篇文章主要介紹了Golang 使用gorm添加數(shù)據(jù)庫排他鎖,for update,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
關(guān)于golang高并發(fā)的實現(xiàn)與注意事項說明
這篇文章主要介紹了關(guān)于golang高并發(fā)的實現(xiàn)與注意事項說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05

