日常開發過程中需要對切換進行一些簡單的檢索、計算等,暫時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())
}
輸出結果