feat(Go-Tool):2020/11/12:新增linq包使用示例(未完成)

This commit is contained in:
Huangzj
2020-11-12 18:10:15 +08:00
parent 3616c4b5e5
commit 2ac2b2666f
33 changed files with 2517 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
/*
* @Author : huangzj
* @Time : 2020/11/12 14:04
* @Description
*/
package linqUse
import "time"
type Book struct {
Name string
Author string
Money float64
WordsNum int
PublishTime time.Time
}
func MakeBook() []Book {
bookList := make([]Book, 0)
bookList = append(bookList, Book{
Name: "Go语言",
Author: "Go",
Money: 100,
WordsNum: 1000,
PublishTime: time.Date(2020, 1, 1, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "Effective Java",
Author: "Java",
Money: 78,
WordsNum: 9000,
PublishTime: time.Date(2020, 2, 15, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "Java语言",
Author: "Java",
Money: 50,
WordsNum: 3000,
PublishTime: time.Date(2020, 2, 1, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "Lua语言",
Author: "Lua",
Money: 75,
WordsNum: 45000,
PublishTime: time.Date(2020, 1, 10, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "React语言",
Author: "React",
Money: 99,
WordsNum: 14500,
PublishTime: time.Date(2020, 7, 1, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "Red语言",
Author: "Red",
Money: 28,
WordsNum: 880,
PublishTime: time.Date(2019, 4, 1, 10, 0, 0, 0, time.Local),
})
bookList = append(bookList, Book{
Name: "JavaScript语言",
Author: "JavaScript",
Money: 81,
WordsNum: 3776,
PublishTime: time.Date(2019, 5, 17, 10, 0, 0, 0, time.Local),
})
return bookList
}
+41
View File
@@ -0,0 +1,41 @@
/*
* @Author : huangzj
* @Time : 2020/11/12 14:43
* @Description:测试方法集合
*/
package linqUse
import "time"
//书籍发布时间是否早于--.--.--
var PublishTimeBeforeFunc = func(thisBook interface{}) bool {
if thisBook.(Book).PublishTime.Before(time.Date(2020, 1, 1, 0, 0, 0, 0, time.Local)) {
return true
}
return false
}
//书籍发布时间是否晚于--.--.--
var PublishTimeAfterFunc = func(thisBook interface{}) bool {
if thisBook.(Book).PublishTime.After(time.Date(2018, 1, 1, 0, 0, 0, 0, time.Local)) {
return true
}
return false
}
//书籍发布时间是否晚于--.--.--
var PublishTimeAfterFunc2 = func(thisBook interface{}) bool {
if thisBook.(Book).PublishTime.After(time.Date(2021, 1, 1, 0, 0, 0, 0, time.Local)) {
return true
}
return false
}
//自定义聚合操作方法
var AggregateFunc = func(first interface{}, second interface{}) interface{} {
if first.(Book).PublishTime.Before(second.(*Book).PublishTime) {
return first
}
return second
}
+104
View File
@@ -0,0 +1,104 @@
/*
* @Author : huangzj
* @Time : 2020/11/12 10:52
* @Description:这边是linq包的使用操作,为之后的使用做一些示例
* 包引用命令: go get github.com/ahmetalpbalkan/go-linq
*/
package linqUse
import (
"Go-Tool/util/timed"
"fmt"
"github.com/ahmetalpbalkan/go-linq"
"testing"
"time"
)
func Test(t *testing.T) {
bookList := MakeBook()
query := linq.From(bookList)
//Aggregate(query) //自定义聚合操作
//
//All(query) //判断数组的所有元素是否都满足条件
//
//AnyWith(query) //判断数组是否有任意个元素满足条件
//Calculate() //这个方法只能计算数值类型
//Combine(query) //组合两个数组的两种方式
//fmt.Println(fmt.Sprintf("跳过三个元素,返回的数组中包含%d个元素", len(query.Skip(3).Results())))
//fmt.Println(fmt.Sprintf("跳过发布时间在2020.1.1之前的元素,返回的数组中包含%d个元素", len(query.SkipWhile(PublishTimeBeforeFunc).Results())))
//Contains(query) //判断数组中是否包含某个元素
//query.CountWith()
//
//query.Distinct()
//query.DistinctBy()
//
//query.OrderBy()
//query.OrderByDescending()
//FirstAndLast(query) //获取第一个/最后一个元素
}
func Combine(query linq.Query) {
query1 := query.Concat(query) //不会排除重复项
query2 := query.Union(query) //会排除重复项
fmt.Println(fmt.Sprintf("不会排除重复项的方法返回的元素个数是%d", len(query1.Results())))
fmt.Println(fmt.Sprintf("会排除重复项的方法返回的元素个数是%d", len(query2.Results())))
}
func FirstAndLast(query linq.Query) {
fmt.Println(fmt.Sprintf("数组第一本书书名叫:%s", query.First().(Book).Name))
fmt.Println(fmt.Sprintf("数组第一本书发布时间在2020年1月1号之前的书书名叫:%s", query.FirstWith(PublishTimeBeforeFunc).(Book).Name))
fmt.Println(fmt.Sprintf("数组最后一本书书名叫:%s", query.Last().(Book).Name))
fmt.Println(fmt.Sprintf("数组最后一本书发布时间在2020年1月1号之前的书书名叫:%s", query.LastWith(PublishTimeBeforeFunc).(Book).Name))
}
func Contains(query linq.Query) {
//这边需要注意是的是如果要判断两个元素是否相等,在go里面不能使用元素的地址
// 所以这边加到query里面的必须不能是元素的地址,否则没办法比较结构体本身,而是比较结构体的地址
fmt.Println(fmt.Sprintf("判断当前数组是否包含相同的元素,判断的是所有的值,而不是地址,结果是%v", query.Contains(Book{
Name: "Go语言",
Author: "Go",
Money: 100,
WordsNum: 1000,
PublishTime: time.Date(2020, 1, 1, 10, 0, 0, 0, time.Local),
})))
}
func Calculate() {
query := linq.From([]int{1, 2, 3, 4, 5, 6, 7, 8, 9})
fmt.Println(fmt.Sprintf("平均值为:%f", query.Average()))
fmt.Println(fmt.Sprintf("最大的值为%d", query.Max()))
fmt.Println(fmt.Sprintf("最小的值为%d", query.Min()))
}
func AnyWith(query linq.Query) {
result := query.AnyWith(PublishTimeBeforeFunc) //判断是否有任意个元素满足条件
fmt.Println(fmt.Sprintf("是否有任意书的发表时间早于2020年1月1号,答案是%v", result))
result = query.AnyWith(PublishTimeAfterFunc2) //判断是否有任意个元素满足条件
fmt.Println(fmt.Sprintf("是否有任意书的发表时间晚于2021年1月1号,答案是%v", result))
}
func All(query linq.Query) {
result := query.All(PublishTimeBeforeFunc)
fmt.Println(fmt.Sprintf("是否所有的书的发表时间都早于2020年1月1号,答案是%v", result))
result = query.All(PublishTimeAfterFunc)
fmt.Println(fmt.Sprintf("是否所有的书的发表时间都晚于2018年1月1号,答案是%v", result))
}
func Aggregate(query linq.Query) {
// 这边的聚合操作其实就是【自定义对应的比较方法】。
// 根据注释,第一次拿到的是数组的第一个元素,然后跟第二个元素进行比较,如果第二个元素符合条件则【替换第一个元素】,否则当前聚合操作还是持有第一个元素。
// 以此类推后面的元素
result := query.Aggregate(AggregateFunc).(*Book)
fmt.Println(fmt.Sprintf("聚合操作查询出的结果是【%s】这本书,它的发布时间最早为:%v", result.Name, timed.GetTimeDefaultFormatString(result.PublishTime.Unix())))
}