陈菊华 發表於 2020-12-5 15:20:00

Golang go-linq使用说明

<p>日常开发过程中需要对切换进行一些简单的检索、计算等,暂时golang没有泛型。基于减少代码的目的go-linq是一个不错的扩展,以下是一些简单的使用说明<br>
如有不全的,请参考官方的文档地址<br>
Git地址:https://github.com/ahmetb/go-linq<br>
文档地址 :https://godoc.org/github.com/ahmetb/go-linq</p>
<p><strong>一、需要引入的包</strong></p>
<pre><code>linq "github.com/ahmetb/go-linq/v3"
</code></pre>
<p><strong>二、初始化测试数据</strong></p>
<pre><code class="language-golang">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})
}
</code></pre>
<p><strong>三、根据条件检索</strong><br>
3.1、注意:以下Take可以写也可以不写,超过范围不会出现数组越界</p>
<pre><code class="language-golang">        fmt.Println("====== 过滤查询学生列表 =====")
        var stus2 []Stu
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 20 &amp;&amp; s.Id &gt; 0
        }).Take(100).ToSlice(&amp;stus2) //Take 固定取几个,也可以不写
        fmt.Println(stus2)
</code></pre>
<p>3.2、查询并排序(根据2个字段),注意先用<font color="red">OrderByDescendingT</font>,后用<font color="red">ThenByDescendingT</font>,升序用<font color="red">OrderByT/ThenByT</font></p>
<pre><code>        fmt.Println("====== 过滤查询学生列表,并排序 =====")
        var stus3 []Stu
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 20 &amp;&amp; s.Id &gt; 0
        }).Take(100).OrderByDescendingT(func(s Stu) string {
                return s.Name
        }).ThenByDescendingT(func(s Stu) int {
                return s.Age
        }).ToSlice(&amp;stus3)
        fmt.Println(stus3)
</code></pre>
<p>3.3、Distinct的用法</p>
<pre><code>        fmt.Println("====== 过滤查询学生列表,根据名字Distinct,再排序 =====")
        var stus4 []Stu
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 20 &amp;&amp; s.Id &gt; 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(&amp;stus4) //DistinctByT 也可以直接改为Distinct():完全匹配
        fmt.Println(stus4)
</code></pre>
<p>3.4、查询单个结构体,也可以用Last()</p>
<pre><code class="language-golang">        fmt.Println("====== 过滤查询单个学生 =====")
        s1 := linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 40 &amp;&amp; strings.Contains(s.Name, "周")
        }).First() //也可以用Last
        fmt.Println(s1)
</code></pre>
<p><strong>四、查询某个属性</strong><br>
示例是查询符合条件的学生姓名</p>
<pre><code>        fmt.Println("====== 过滤结构体并查询姓名 =====")
        var names []string
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 30 &amp;&amp; s.Id &gt; 0
        }).SelectT(func(s Stu) string {
                return s.Name
        }).ToSlice(&amp;names)
        fmt.Println(names)
</code></pre>
<p><strong>五、简单的一些计算函数</strong></p>
<pre><code class="language-golang">        fmt.Println("====== 函数相关 =====")
        stuQuery := linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 0 &amp;&amp; s.Id &gt; 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())
</code></pre>
<p><strong>完整的代码如下</strong></p>
<pre><code class="language-golang">package main

import (
        "fmt"
        linq "github.com/ahmetb/go-linq/v3"
        "strings"
)

type Stu struct {
        Id   int    //编号
        Name string //姓名
        Ageint    //年龄
}

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 &gt;= 20 &amp;&amp; s.Id &gt; 0
        }).Take(100).ToSlice(&amp;stus2) //Take 固定取几个,也可以不写
        fmt.Println(stus2)

        fmt.Println("====== 过滤查询学生列表,并排序 =====")
        var stus3 []Stu
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 20 &amp;&amp; s.Id &gt; 0
        }).Take(100).OrderByDescendingT(func(s Stu) string {
                return s.Name
        }).ThenByDescendingT(func(s Stu) int {
                return s.Age
        }).ToSlice(&amp;stus3)
        fmt.Println(stus3)

        fmt.Println("====== 过滤查询学生列表,根据名字Distinct,再排序 =====")
        var stus4 []Stu
        linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 20 &amp;&amp; s.Id &gt; 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(&amp;stus4) //DistinctByT 也可以直接改为Distinct():完全匹配
        fmt.Println(stus4)

        fmt.Println("====== 过滤查询单个学生 =====")
        s1 := linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 40 &amp;&amp; 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 &gt;= 30 &amp;&amp; s.Id &gt; 0
        }).SelectT(func(s Stu) string {
                return s.Name
        }).ToSlice(&amp;names)
        fmt.Println(names)

        fmt.Println("====== 函数相关 =====")
        stuQuery := linq.From(stus).WhereT(func(s Stu) bool {
                return s.Age &gt;= 0 &amp;&amp; s.Id &gt; 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())
}

</code></pre>
<p><strong>输出结果</strong><br>
<img src="https://img2020.cnblogs.com/blog/308699/202012/308699-20201205155227435-2077432007.png" alt="" loading="lazy"></p><br><br>
来源:https://www.cnblogs.com/nickchou/p/14088778.html
頁: [1]
查看完整版本: Golang go-linq使用说明