Golang Go语言中:GGM 首个泛型 ORM 库发布

发布于 1周前 作者 phonegap100 来自 Go语言

github 直达 github.com/daodao97/ggm

欢迎大佬们多多指点, 给个 Star.

包含泛型特性的 go1.18 已经正式发布, 于是就迫不及待的体验了一把.

我们来看下日常的 db 交互中, 使用泛型, 将会带来哪些便利.

以下为伪代码, 仅做示意.

// 预定义的结构体
type User struct{
	Id      int    `db:"id"`
	Name    string `db:"name"`
}

database/sql 的原生写法

db := sql.Open()

stmt, err := db.Prepare(sql) if err != nil { return }

rows, err := stmt.Query(args…) if err != nil { return }

var list []*User for rows.Next() { tmp := new(User) rows.Scan(tmp.Id, tmp.User) list = append(list, tmp) }

原生写法相对比较繁琐, 可能一般项目中不会作为首选方案.

稍微封装下的 db 类库


db = xxx.Conn()

var list []*User

_ = db.Query(sql, &list)

for _, u := range list { fmt.Println(u.Id) }

可以看出, 相对于原生写法, 代码已经十分简洁, 但是我们不得不提前定义 var list []*User

并且需要将其已指针形式 &list 传入类库, 熟悉其他语言的同学就会觉得这里看起来十分蹩脚了.

泛型的 db 类库


list, _ := ggm.New[User]().Select(sql)

for _, u := range list { fmt.Println(u.Id) }

在泛型类库中, 查询后, 无需任何转换 list 的类型已经是 []User.

相对于第二写种法, 代码又精进了异步, 更加的简洁直观了.

传送门

github 直达 github.com/daodao97/ggm

欢迎大佬们多多指点, 给个 Star.


Golang Go语言中:GGM 首个泛型 ORM 库发布

更多关于Golang Go语言中:GGM 首个泛型 ORM 库发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

…… 无恶意,你看过 GORM 的源码吗



当执行一个查询的时候,model 一定是「有类型」的,所以在设计查询接口的时候,目标并不是抹除输入数据的类型差异,相反还要要提取出输入的类型特征加以处理。所以 gorm 用 interface{}来接纳任意类型后用了大量反射手段去还原 interface 的具体 <模型或类型> 是啥


之前看过有个大佬写的博客感觉很有启发,泛型能改善的最大问题是高阶函数:

func (S) filter (d []type1, f func (e type1) bool ) []type1

func (S) filter (d []type2, f func (e type2) bool ) []type2
是两个不同的函数。但有了泛型,可以只写一次。
https://go.dev/play/p/OHdhzMstFxW

我感觉 拼一套低配 LINQ 还是挺有可能而且有意义的

更多关于Golang Go语言中:GGM 首个泛型 ORM 库发布的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


最近这个仓库的星星上升很快

https://github.com/samber/lo

之前范型未出来之前好几个 FP 库用的人少,其中不受还被作者自己弃库了,现在可能会变得不同

不要泛型, 泛型是异端, 统统烧死

赞同大佬的观点, 泛型确实会对工具类函数很有帮助, 能显著的减少代码量, 比如 2 楼大佬贴的 lo 库,

ggm 内部也会用反射去解析下当前 struct 的属性, 并未看过 gorm 的源码, 私以为跟 sqlx 类的 底层原理应该是相似的.

此处也只是泛型出来后的上手实践, 玩玩儿嘛

新鲜事物还是要接受一下的, 哈哈

尴尬了,我的 stl 库看来这下要大改了

赞同,其实这次泛型出来了,我最兴奋的就是我可以更快的撸业务了。
所以写了一个包,各位大佬可以看看。

https://v2ex.com/t/842117

https://github.com/wwaayyaa/go-collection

针对“Golang Go语言中:GGM 首个泛型 ORM 库发布”的帖子,作为IT营GO语言方面的专家,以下是我的回复:

GGM作为Golang中的首个泛型ORM库,其发布无疑为Go语言生态带来了重要的变革。泛型在Go 1.18版本中的正式引入,使得开发者能够编写更加通用和可重用的代码,而GGM正是利用了这一特性,为ORM操作提供了更为灵活和强大的支持。

在传统的ORM库中,由于缺乏泛型的支持,开发者往往需要为不同的数据类型编写重复的代码。而GGM通过泛型的引入,实现了对不同数据类型的统一处理,从而大大减少了代码的冗余和复杂性。

此外,GGM还提供了丰富的ORM操作功能,包括数据表的自动映射、CRUD操作、事务处理等,这些功能都基于泛型进行了优化和实现,使得开发者能够更加高效地进行数据库操作。

对于Go语言开发者来说,GGM的发布无疑是一个好消息。它不仅能够提高开发效率,还能够降低代码维护的复杂性。同时,随着Go语言生态的不断发展和完善,相信未来会有更多的泛型库和工具涌现出来,为开发者提供更加便捷和高效的开发体验。

回到顶部