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

3 回复

GO 的泛型语法真奇葩

更多关于Golang Go语言中使用一个数据处理库来泛型尝鲜的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


各花入各眼。

在Golang中,随着1.18版本的发布,泛型终于成为了语言的一部分,这为数据处理等场景带来了更多的灵活性和代码复用性。如果你想在Go语言中使用一个数据处理库来体验泛型,有几个关键点需要注意。

首先,选择一个支持泛型的数据处理库是很重要的。一些流行的数据处理库,如go-collectiongenerics-example(这些库名仅为示例,实际使用时请查找最新的、社区支持良好的库),已经更新以支持泛型。这些库通常提供了对集合(如切片、映射等)的泛型操作,如过滤、映射、归约等。

其次,在使用这些库时,你需要熟悉Go的泛型语法。泛型在Go中是通过类型参数(type parameters)来实现的,它们允许你在定义函数、类型或接口时指定一个或多个类型,这些类型在函数或类型被实例化时会被具体的类型所替换。

最后,为了充分利用泛型,你可能需要重构一些现有的代码。虽然这可能需要一些额外的工作,但长远来看,泛型将提高代码的复用性和可维护性,使你的数据处理代码更加简洁和强大。

总的来说,在Go语言中使用一个支持泛型的数据处理库是一个很好的选择,它将帮助你更好地利用Go的新特性,提高代码的质量和效率。如果你刚开始接触泛型,建议从简单的例子开始,逐步深入,以便更好地理解和掌握这一强大的特性。

回到顶部