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

go-linq很不错的golanglinq包

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

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


鲜花

握手

雷人

路过

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

请发表评论

全部评论

专题导读
上一篇:
linux下交叉编译go项目发布时间:2022-07-10
下一篇:
linux系统go语言安装发布时间: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