Golang Go语言中使用一个数据处理库来泛型尝鲜
这是一个用 Go 实现的数据处理库,升级之前用 interface{}表示参数类型,阅读起来还是容易模糊。现在泛型出了之后,就把它升级一下:
原来:
// extract column from table
// * First Argument:table
// * Second Argument:column name
result := query.Column(users, "UserID")
userIDs := result.([]int)
// generate a map from table,key is column value and value is it’s row
// * First Argument:table
// * Second Argument:column name
result = query.ColumnMap(users, “UserID”)
userMap := result.(map[int]User)
// select data from table
// * First Argument:table
// * Second Argument:select rule
result = query.Select(users, func(a User) Sex {
if len(a.Name) >= 3 && a.Name[0:3] == “Man” {
return Sex{IsMale: true}
}
return Sex{IsMale: false}
})
sel := result.([]Sex)
// filter data from table
// * First Argument:table
// * Second Argument:filter rule
result = query.Where(users, func(a User) bool {
if len(a.Name) >= 3 && a.Name[0:3] == “Man” {
return true
}
return false
})
where := result.([]User)
// group data from table
// * First Argument: left table
// * Second Argument: group column name
// * Third Argument: group rule
result = query.Group(users, “UserID”, func(users []User) Department {
return Department{
Employees: users,
}
})
group := result.([]Department)
// join data from two table ,support LeftJoin,RightJoin,InnerJoin 和 OuterJoin
// * First Argument: left table
// * Second Argument: right table
// * Third Argument: join condition
// * Forth Argument: join rule
result = query.LeftJoin(admins, users, “AdminID = UserID”, func(admin Admin, user User) AdminUser {
return AdminUser{
AdminID: admin.AdminID,
Level: admin.Level,
Name: user.Name,
CreateTime: user.CreateTime,
}
})
join := result.([]AdminUser)
现在
// extract column from table
// * First Argument:table
// * Second Argument:column name
userIDs := query.Column[User, int](users, "UserID") // []int
// generate a map from table,key is column value and value is it’s row
// * First Argument:table
// * Second Argument:column name
userMap = query.ColumnMapUser, int, map[int]User // map[int]User
// or
usersMap = query.ColumnMapUser, int, map[int][]User // map[int][]User
// select data from table
// * First Argument:table
// * Second Argument:select rule
sel = query.Select(users, func(a User) Sex {
if len(a.Name) >= 3 && a.Name[0:3] == “Man” {
return Sex{IsMale: true}
}
return Sex{IsMale: false}
}) // []Sex
// filter data from table
// * First Argument:table
// * Second Argument:filter rule
where = query.Where(users, func(a User) bool {
if len(a.Name) >= 3 && a.Name[0:3] == “Man” {
return true
}
return false
}) // []User
// group data from table
// * First Argument: left table
// * Second Argument: group column name
// * Third Argument: group rule
group = query.Group[User, Department, []Department](users, “UserID”, func(users []User) Department {
return Department{
Employees: users,
}
}) // []Department
// or
group = query.Group[User, []Department, *[]Department](users, “UserID”, func(users []User) []Department {
return []Department{
Employees: users,
}
}) // *[]Department
// join data from two table ,support LeftJoin,RightJoin,InnerJoin 和 OuterJoin
// * First Argument: left table
// * Second Argument: right table
// * Third Argument: join condition
// * Forth Argument: join rule
join = query.LeftJoin(admins, users, “AdminID = UserID”, func(admin Admin, user User) AdminUser {
return AdminUser{
AdminID: admin.AdminID,
Level: admin.Level,
Name: user.Name,
CreateTime: user.CreateTime,
}
}) // []AdminUser
减少了断言,还是挺好的。
一点问题
目前的 Go 泛型不支持类型参数内嵌,所以在 Group 函数里使用了指针。
// 这样是不行的
func Group[T, E any, R E | []E](data []T, groupType string, groupFunctor func([]T) E) R
// 只好写成这样
func Group[T, E any, R *E | []E](data []T, groupType string, groupFunctor func([]T) E) R
Golang Go语言中使用一个数据处理库来泛型尝鲜
更多关于Golang Go语言中使用一个数据处理库来泛型尝鲜的实战教程也可以访问 https://www.itying.com/category-94-b0.html
各花入各眼。
在Golang中,随着1.18版本的发布,泛型终于成为了语言的一部分,这为数据处理等场景带来了更多的灵活性和代码复用性。如果你想在Go语言中使用一个数据处理库来体验泛型,有几个关键点需要注意。
首先,选择一个支持泛型的数据处理库是很重要的。一些流行的数据处理库,如go-collection
或generics-example
(这些库名仅为示例,实际使用时请查找最新的、社区支持良好的库),已经更新以支持泛型。这些库通常提供了对集合(如切片、映射等)的泛型操作,如过滤、映射、归约等。
其次,在使用这些库时,你需要熟悉Go的泛型语法。泛型在Go中是通过类型参数(type parameters)来实现的,它们允许你在定义函数、类型或接口时指定一个或多个类型,这些类型在函数或类型被实例化时会被具体的类型所替换。
最后,为了充分利用泛型,你可能需要重构一些现有的代码。虽然这可能需要一些额外的工作,但长远来看,泛型将提高代码的复用性和可维护性,使你的数据处理代码更加简洁和强大。
总的来说,在Go语言中使用一个支持泛型的数据处理库是一个很好的选择,它将帮助你更好地利用Go的新特性,提高代码的质量和效率。如果你刚开始接触泛型,建议从简单的例子开始,逐步深入,以便更好地理解和掌握这一强大的特性。