
比来最早操练 ,独霸对筹的独工作技能栈次要Python和Golang,反射如今的划体义务把Python模块重构为GO模块,然后展示了一个问题 ,优雅就是排序要将一个筹划体按筹划体中各个字段举办排序,然后写进Redis,霸编对Pyhon来讲for轮回就可以措置 ,可是独霸对筹的独对Go言语来讲,每次排序都要写一个斗劲函数,反射写出来的划体代码太丑 ,特别很是优雅长,代码筹划是排序齐截 ,只是霸编斗劲字段不一样罢了,小我没法领受啊 ,独霸对筹的独网上搜刮也没搜刮到契合措置编制 ,反射所以本身想了一个措置编制来优雅排序。划体
斗劲函数 :
func reflectCmp(i, j inte***ce{ }, fieldName string) bool { //按传进fieldName 排序 valI := reflect.ValueOf(i).FieldByName(fieldName).Inte***ce() valJ := reflect.ValueOf(j).FieldByName(fieldName).Inte***ce() 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中便可。
假定我们有一个筹划体为
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) // 遍历筹划体全数成员 for i := 0; i < typeOfA.NumField(); i++ { // 掉落踪掉落踪每个成员的筹划体字段圭表类型 fieldType := typeOfA.Field(i) sort.Slice(pSlice,func(i, j int) bool { return reflectCmp(pSlice[i],pSlice[j],fieldType.Name) }) fmt.Println(pSlice) }}运转下场

独霸反射 ,非论筹划体有若干很多若干良多若干很多若干良多若干很多若干个字段,我们都能用一个for 排序便可优雅完成排序 。
到此这篇关于Golang 独霸反射对筹划体优雅排序的文章就引见到这了,更多相干Go言语反射筹划体排序内容请搜刮完竣下载之前的文章或延续不雅不雅不雅不雅鉴赏上面的相干文章希看大年夜师往后多多支撑完竣下载 !
本文由作文网焦点栏目发布,感谢您对作文网的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人站长或者朋友圈,但转载请说明文章出处“Golang 独霸反射对筹划体优雅排序的独霸编制”
