GGM: 首个 Gloang 泛型 ORM 库发布 🚀

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.

本作品采用《CC 协议》,转载必须注明作者和本文链接
daodao97
讨论数量: 2

这个更早 github.com/golobby/orm

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!