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())
}
输出结果
分类:
golang
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
· 乌龟冬眠箱湿度监控系统和AI辅助建议功能的实现