#### github 直达 [github.com/daodao97/ggm]( https://github.com/daodao97/ggm)
欢迎大佬们多多指点, 给个 Star.
包含泛型特性的 `go1.18` 已经正式发布, 于是就迫不及待的体验了一把.
我们来看下日常的 `db` 交互中, 使用泛型, 将会带来哪些便利.
以下为伪代码, 仅做示意.
```go
// 预定义的结构体
type User struct{
Id int `db:"id"`
Name string `db:"name"`
}
```
### `database/sql` 的原生写法
```go
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 类库
```go
db = xxx.Conn()
var list []*User
_ = db.Query(sql, &list)
for _, u := range list {
fmt.Println(u.Id)
}
```
可以看出, 相对于原生写法, 代码已经十分简洁, 但是我们不得不提前定义 `var list []*User`
并且需要将其已指针形式 `&list` 传入类库, 熟悉其他语言的同学就会觉得这里看起来十分蹩脚了.
### 泛型的 db 类库
```go
list, _ := ggm.New[User]().Select(sql)
for _, u := range list {
fmt.Println(u.Id)
}
```
在泛型类库中, 查询后, 无需任何转换 `list` 的类型已经是 `[]User`.
相对于第二写种法, 代码又精进了异步, 更加的简洁直观了.
### 传送门
更多内容可以查下项目详情
github 直达 [github.com/daodao97/ggm]( https://github.com/daodao97/ggm)
欢迎大佬们多多指点, 给个 Star.