Golang go-linq使用說明


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

輸出結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM