zoukankan      html  css  js  c++  java
  • Golang go-linq使用说明

    日常开发过程中需要对切换进行一些简单的检索、计算等,暂时golang没有泛型。基于减少代码的目的go-linq是一个不错的扩展,以下是一些简单的使用说明
    如有不全的,请参考官方的文档地址
    Git地址:https://github.com/ahmetb/go-linq
    文档地址 :https://godoc.org/github.com/ahmetb/go-linq

    一、需要引入的包

    linq "github.com/ahmetb/go-linq/v3"
    

    二、初始化测试数据

    type Stu struct {
    	Id       int       //编号
    	Name     string    //姓名
    	Age      int       //年龄
    }
    func main() {
    	var stus []Stu
    	fmt.Println("====== 初始化数据 =====")
    	stus = append(stus, Stu{Id: 1, Name: "张一", Age: 10})
    	stus = append(stus, Stu{Id: 2, Name: "李二", Age: 20})
    	stus = append(stus, Stu{Id: 3, Name: "王三", Age: 20})
    	stus = append(stus, Stu{Id: 4, Name: "刘四", Age: 30})
    	stus = append(stus, Stu{Id: 5, Name: "黄五", Age: 40})
    	stus = append(stus, Stu{Id: 6, Name: "周六", Age: 50})
    	stus = append(stus, Stu{Id: 7, Name: "周六", Age: 60})
    }
    

    三、根据条件检索
    3.1、注意:以下Take可以写也可以不写,超过范围不会出现数组越界

    	fmt.Println("====== 过滤查询学生列表 =====")
    	var stus2 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).ToSlice(&stus2) //Take 固定取几个,也可以不写
    	fmt.Println(stus2)
    

    3.2、查询并排序(根据2个字段),注意先用OrderByDescendingT,后用ThenByDescendingT,升序用OrderByT/ThenByT

    	fmt.Println("====== 过滤查询学生列表,并排序 =====")
    	var stus3 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).OrderByDescendingT(func(s Stu) string {
    		return s.Name
    	}).ThenByDescendingT(func(s Stu) int {
    		return s.Age
    	}).ToSlice(&stus3)
    	fmt.Println(stus3)
    

    3.3、Distinct的用法

    	fmt.Println("====== 过滤查询学生列表,根据名字Distinct,再排序 =====")
    	var stus4 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).OrderByDescendingT(func(s Stu) string {
    		return s.Name
    	}).ThenByDescendingT(func(s Stu) int {
    		return s.Age
    	}).DistinctByT(func(s Stu) string {
    		return s.Name
    	}).ToSlice(&stus4) //DistinctByT 也可以直接改为Distinct():完全匹配
    	fmt.Println(stus4)
    

    3.4、查询单个结构体,也可以用Last()

    	fmt.Println("====== 过滤查询单个学生 =====")
    	s1 := linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 40 && strings.Contains(s.Name, "周")
    	}).First() //也可以用Last
    	fmt.Println(s1)
    

    四、查询某个属性
    示例是查询符合条件的学生姓名

    	fmt.Println("====== 过滤结构体并查询姓名 =====")
    	var names []string
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 30 && s.Id > 0
    	}).SelectT(func(s Stu) string {
    		return s.Name
    	}).ToSlice(&names)
    	fmt.Println(names)
    

    五、简单的一些计算函数

    	fmt.Println("====== 函数相关 =====")
    	stuQuery := linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 0 && s.Id > 0
    	}).SelectT(func(s Stu) int {
    		return s.Age
    	})
    	fmt.Println("平均年龄:", stuQuery.Average())
    	fmt.Println("最大年龄:", stuQuery.Max())
    	fmt.Println("最小年龄:", stuQuery.Min())
    	fmt.Println("总年龄:", stuQuery.SumInts()) // .SumFloats()
    	fmt.Println("共查询学生:", stuQuery.Count())
    	fmt.Println("共查询学生(Distinct):", stuQuery.Distinct().Count())
    

    完整的代码如下

    package main
    
    import (
    	"fmt"
    	linq "github.com/ahmetb/go-linq/v3"
    	"strings"
    )
    
    type Stu struct {
    	Id   int    //编号
    	Name string //姓名
    	Age  int    //年龄
    }
    
    func main() {
    	var stus []Stu
    	fmt.Println("====== 初始化数据 =====")
    	stus = append(stus, Stu{Id: 1, Name: "张一", Age: 10})
    	stus = append(stus, Stu{Id: 2, Name: "李二", Age: 20})
    	stus = append(stus, Stu{Id: 3, Name: "王三", Age: 20})
    	stus = append(stus, Stu{Id: 4, Name: "刘四", Age: 30})
    	stus = append(stus, Stu{Id: 5, Name: "黄五", Age: 40})
    	stus = append(stus, Stu{Id: 6, Name: "周六", Age: 50})
    	stus = append(stus, Stu{Id: 7, Name: "周六", Age: 60})
    	fmt.Println(stus)
    
    	fmt.Println("====== 过滤查询学生列表 =====")
    	var stus2 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).ToSlice(&stus2) //Take 固定取几个,也可以不写
    	fmt.Println(stus2)
    
    	fmt.Println("====== 过滤查询学生列表,并排序 =====")
    	var stus3 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).OrderByDescendingT(func(s Stu) string {
    		return s.Name
    	}).ThenByDescendingT(func(s Stu) int {
    		return s.Age
    	}).ToSlice(&stus3)
    	fmt.Println(stus3)
    
    	fmt.Println("====== 过滤查询学生列表,根据名字Distinct,再排序 =====")
    	var stus4 []Stu
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 20 && s.Id > 0
    	}).Take(100).OrderByDescendingT(func(s Stu) string {
    		return s.Name
    	}).ThenByDescendingT(func(s Stu) int {
    		return s.Age
    	}).DistinctByT(func(s Stu) string {
    		return s.Name
    	}).ToSlice(&stus4) //DistinctByT 也可以直接改为Distinct():完全匹配
    	fmt.Println(stus4)
    
    	fmt.Println("====== 过滤查询单个学生 =====")
    	s1 := linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 40 && strings.Contains(s.Name, "周")
    	}).First() //也可以用Last
    	fmt.Println(s1)
    
    	fmt.Println("====== 过滤结构体并查询姓名 =====")
    	var names []string
    	linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 30 && s.Id > 0
    	}).SelectT(func(s Stu) string {
    		return s.Name
    	}).ToSlice(&names)
    	fmt.Println(names)
    
    	fmt.Println("====== 函数相关 =====")
    	stuQuery := linq.From(stus).WhereT(func(s Stu) bool {
    		return s.Age >= 0 && s.Id > 0
    	}).SelectT(func(s Stu) int {
    		return s.Age
    	})
    	fmt.Println("平均年龄:", stuQuery.Average())
    	fmt.Println("最大年龄:", stuQuery.Max())
    	fmt.Println("最小年龄:", stuQuery.Min())
    	fmt.Println("总年龄:", stuQuery.SumInts()) // .SumFloats()
    	fmt.Println("共查询学生:", stuQuery.Count())
    	fmt.Println("共查询学生(Distinct):", stuQuery.Distinct().Count())
    }
    
    

    输出结果

  • 相关阅读:
    python实现布隆过滤器及原理解析
    gin框架源码解析
    阿里云docker操作问题记录
    Qt编写数据可视化大屏界面电子看板系统
    CSS3-3D制作案例分析实战
    前端可视化项目流程,涉及three.js(webGL),3DMax技术,持续更新
    前端可视化项目流程,涉及three.js(webGL),3DMax技术,持续更新
    jquery拖拽排序,针对后台列表table进行拖拽排序(Echart不刷新页面,多语言切换下的地图数据重新加载,api请求数据加载
    Java 设置Excel条件格式(高亮条件值、应用单元格值/公式/数据条等类型)C# 创建Excel气泡图
    Java 如何在PPT中设置形状组合、取消组合、编辑组合形状
  • 原文地址:https://www.cnblogs.com/nickchou/p/14088778.html
Copyright © 2011-2022 走看看