欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法

 更新時間:2021年10月14日 10:23:13   作者:m0_62924778  
這篇文章主要介紹了Golang 利用反射對結(jié)構(gòu)體優(yōu)雅排序的操作方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

最近開始實習,工作技術(shù)棧主要Python和Golang,目前的任務把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中即可。

假設我們有一個結(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)文章

  • 如何在Go中使用切片容量和長度

    如何在Go中使用切片容量和長度

    這篇文章主要介紹了如何在Go中使用切片容量和長度,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 使用Go語言生成二維碼并在命令行中輸出

    使用Go語言生成二維碼并在命令行中輸出

    二維碼(QR code)是一種矩陣條碼的標準,廣泛應用于商業(yè)、移動支付和數(shù)據(jù)存儲等領域,在開發(fā)過程中,我們可能需要在命令行中顯示二維碼,這可以幫助我們快速生成和分享二維碼信息,本文將介紹如何使用Go語言生成二維碼并在命令行中輸出,需要的朋友可以參考下
    2023-11-11
  • 淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因

    淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因

    本文主要介紹了淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • golang高性能的http請求 fasthttp詳解

    golang高性能的http請求 fasthttp詳解

    fasthttp 是 Go 的快速 HTTP 實現(xiàn),當前在 1M 并發(fā)的生產(chǎn)環(huán)境使用非常成功,可以從單個服務器進行 100K qps 的持續(xù)連接,總而言之,fasthttp 比 net/http 快 10 倍,下面通過本文給大家介紹golang fasthttp http請求的相關(guān)知識,一起看看吧
    2021-09-09
  • Golang import 導入包語法及一些特殊用法詳解

    Golang import 導入包語法及一些特殊用法詳解

    這篇文章主要介紹了Golang import 導入包語法及一些特殊用法,需要的朋友可以參考下
    2020-02-02
  • go如何終止多個for select循環(huán)嵌套的方法

    go如何終止多個for select循環(huán)嵌套的方法

    當您想從嵌套循環(huán)中中斷,從select內(nèi)部終止循環(huán)時,標記的中斷非常有用,本文主要介紹了go如何終止多個for select循環(huán)嵌套的方法,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Centos下搭建golang環(huán)境及vim高亮Go關(guān)鍵字設置的方法

    Centos下搭建golang環(huán)境及vim高亮Go關(guān)鍵字設置的方法

    這篇文章先給大家詳細介紹了在Centos下搭建golang環(huán)境的步驟,大家按照下面的方法就可以自己搭建golang環(huán)境,搭建完成后又給大家介紹了vim高亮Go關(guān)鍵字設置的方法,文中通過示例代碼介紹的很詳細,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-11-11
  • windows下安裝make及使用makefile文件

    windows下安裝make及使用makefile文件

    這篇文章主要為大家介紹了windows下安裝make及使用makefile文件方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 深入探究Go語言從反射到元編程的實踐與探討

    深入探究Go語言從反射到元編程的實踐與探討

    反射和元編程是一些高級編程概念,它們使開發(fā)者能夠在運行時檢查、修改并控制程序的行為,了解反射和元編程的工作方式可以幫助我們更好地理解Go,以及如何在需要的時候高效地使用它們,文章中介紹的非常詳細,感興趣的同學可以參考下
    2023-05-05
  • golang 對私有函數(shù)進行單元測試的實例

    golang 對私有函數(shù)進行單元測試的實例

    這篇文章主要介紹了golang 對私有函數(shù)進行單元測試的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-05-05

最新評論