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())
    }
    
    

    输出结果

  • 相关阅读:
    BTRON 八十年代日本夭折的操作系统。
    zz白话说学计算机图形学
    陈怀临时间–浅谈微内核QNX/Neutrino
    java封装详解
    maven基础学习为什么要用maven,帮助解决了什么问题,怎么解决的,希望以后学习每个知识点都可以这样问下自己
    vscode开发vue,热更新
    Vue.js到前端工程化
    简洁好用的数据库表结构文档生成工具
    Java的修饰符
    1.谷粒商城000前言
  • 原文地址:https://www.cnblogs.com/nickchou/p/14088778.html
Copyright © 2011-2022 走看看