go-linq 很不错的golang linq 包
go-linq 是.net linq 的golang 实现,使用简单灵活,而且支持多种操作模式,同时也支持基于范型函数,使得代码更清晰
linq 参考格式
From(slice) .Where(predicate) .Select(selector) .Union(data)
参考使用
集成了mitchellh/mapstructure 一个方便的数据类型转换工具
package main
import (
"log"
. "github.com/ahmetb/go-linq/v3"
"github.com/mitchellh/mapstructure"
)
type MyQuery Query
func (q MyQuery) GreaterThan(threshold int) Query {
return Query{
Iterate: func() Iterator {
next := q.Iterate()
return func() (item interface{}, ok bool) {
for item, ok = next(); ok; item, ok = next() {
if item.(int) > threshold {
return
}
}
return
}
},
}
}
func main() {
type Person struct {
Name string
Age int
Emails []string
Extra map[string]string
}
input := map[string]interface{}{
"name": "Mitchell",
"age": 91,
"emails": []string{"one", "two", "three"},
"extra": map[string]string{
"twitter": "mitchellh",
},
}
// map 转struct
var result Person
err := mapstructure.Decode(input, &result)
if err != nil {
panic(err)
}
var users []Person = make([]Person, 2)
var names []string
var names2 []struct {
name string
age int
}
users = append(users, result)
// linq 使用
From(users).Where(func(u interface{}) bool {
p := u.(Person)
return p.Age > 10
}).SelectT(func(p Person) string {
return p.Name
}).ToSlice(&names)
for _, name := range names {
log.Println(name)
}
From(users).Where(func(u interface{}) bool {
p := u.(Person)
return p.Age > 10
}).Select(func(p interface{}) interface{} {
person := p.(Person)
return struct {
name string
age int
}{
name: person.Name,
age: person.Age,
}
}).ToSlice(&names2)
for _, name := range names2 {
log.Println(name)
}
// 测试自定义query
results := MyQuery(Range(1, 100)).GreaterThan(97).Results()
for _, result := range results {
log.Println(result)
}
}
说明
mitchellh/mapstructure 与go-linq 是一个很不错的golang 工具包,可以简化我们好多开发工作
参考资料
https://github.com/ahmetb/go-linq
https://github.com/mitchellh/mapstructure
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2019-10-19 为知笔记docker 版本运行
2018-10-19 dbt 基本试用
2017-10-19 add-apt-repository 添加
2014-10-19 UNIX 时间戳 C#