数组、结构体切片排序方法

167 阅读2分钟

写在前面

最近由于工作需要,存在发布数据从公司CMDB导入Elasticsearch,再由Kibana完成可视化展示的需求。初学Golang,我所采用的方法是使用Golang来进行:模拟登陆—爬取相关数据—根据实际业务需求处理相关数据(这里我开始的做法是将爬到的数据最终以String的方式进行处理,这种做法是非常低效的。)—调用go-elasticsearch的API批量插入数据-最后通过Kibana完成发布数据展示。现在学到数组、结构体切片排序方法,发现可以批量处理Json大大提高效率(按结构体方式处理相关数据批量导入),记录一下。

代码

package main
// 其中math/rand包是用来用来生成随机数模拟导入的过程,sort包为系统排序包
    import (
        "fmt"
        "math/rand"
        "sort"
)
// 新建一个Stu结构体其中包含Name、Age、Score字段
type Stu struct {
    Name string
    Age int
    Score float64
}
// 根据结构体来做结构体切片
type Student []Stu
// 这边用到sort包需要的三个方法
func (st Student) Len() int{
    return len(st)
}
func (st Student) Swap(i,j int) {
    temp := st[i]
    st[i] = st[j]
    st[j] = temp
}
/* 
上面三行代码可以简洁写成
    st[i],st[j] = st[j],st[i]
*/
// 下面的方法可以根据结构体的具体字段来做排序工作,这里以Score举例
func (st Student) Less(i,j int) bool{
    return st[i].Score > st[j].Score
}
func main() {
// 这边先来试试int数组的排序
    var intSlice = []int{6,-1,36,2,50,-2,8}
    sort.Ints(intSlice)
    fmt.Println(intSlice)
    // 再来是结构体切片的排序、生成随机数模拟批量导入的过程
    var students Student
    for i := 0 ; i < 10 ; i++ {
        student := Stu {
            Name : fmt.Sprintf("学生%d",rand.Intn(100)),
            Age : rand.Intn(100),
            Score : 100 * rand.Float64(),
        }
    students = append(students,student)
    }    
// 检查一下有没有导入成功
   for _,v := range students{
       fmt.Println(v)
   }
   sort.Sort(students)
   fmt.Println("---------下面为按照Score排序后的结构体")
      for _,v := range students{
       fmt.Println(v)
   }
}

最佳实践

如果项目中拿到返回为Json类型。可以使用下面网站完成从Json到Go Struct的快速转换。sort包的具体用法可以查看Golang的官方文档。

mholt.github.io/json-to-go/

捕获.PNG

doc.golang.ltd/