• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Golang go-linq使用说明

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

日常开发过程中需要对切换进行一些简单的检索、计算等,暂时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())
}

输出结果


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go语言核心36讲(Go语言基础知识三)--学习笔记发布时间:2022-07-10
下一篇:
gopost上传文件的例子发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap