Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法
最近開始實(shí)習(xí),工作技術(shù)棧主要Python和Golang,目前的任務(wù)把Python模塊重構(gòu)為GO模塊,然后出現(xiàn)了一個(gè)問題,就是要將一個(gè)結(jié)構(gòu)體按結(jié)構(gòu)體中各個(gè)字段進(jìn)行排序,然后寫入Redis,對于Pyhon來說for循環(huán)就能解決,但是對于Go語言來說,每一次排序都要寫一個(gè)比較函數(shù),寫出來的代碼太丑,非常長,代碼結(jié)構(gòu)是一致,只是比較字段不一樣而已,個(gè)人無法接受啊,網(wǎng)上搜索也沒搜索到合適解決方法,所以自己想了一個(gè)解決方法來優(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è)我們有一個(gè)結(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++ { // 獲取每個(gè)成員的結(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) } }
運(yùn)行結(jié)果
利用反射,不管結(jié)構(gòu)體有多少個(gè)字段,我們都能用一個(gè)for 排序即可優(yōu)雅完成排序。
到此這篇關(guān)于Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的文章就介紹到這了,更多相關(guān)Golang反射結(jié)構(gòu)體排序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因
本文主要介紹了淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Golang import 導(dǎo)入包語法及一些特殊用法詳解
這篇文章主要介紹了Golang import 導(dǎo)入包語法及一些特殊用法,需要的朋友可以參考下2020-02-02go如何終止多個(gè)for select循環(huán)嵌套的方法
當(dāng)您想從嵌套循環(huán)中中斷,從select內(nèi)部終止循環(huán)時(shí),標(biāo)記的中斷非常有用,本文主要介紹了go如何終止多個(gè)for select循環(huán)嵌套的方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01Centos下搭建golang環(huán)境及vim高亮Go關(guān)鍵字設(shè)置的方法
這篇文章先給大家詳細(xì)介紹了在Centos下搭建golang環(huán)境的步驟,大家按照下面的方法就可以自己搭建golang環(huán)境,搭建完成后又給大家介紹了vim高亮Go關(guān)鍵字設(shè)置的方法,文中通過示例代碼介紹的很詳細(xì),有需要的朋友們可以參考借鑒,下面來一起看看吧。2016-11-11golang 對私有函數(shù)進(jìn)行單元測試的實(shí)例
這篇文章主要介紹了golang 對私有函數(shù)進(jìn)行單元測試的實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05