golang 结构体 泛型
时间: 2025-02-04 18:10:27 浏览: 69
### 结合使用结构体与泛型
在 Go 语言中,自版本 1.18 起引入了对泛型的支持,这使得开发者能够编写更加灵活和可重用的代码[^2]。当涉及到数据库操作时,利用泛型可以显著简化模型层的设计并增强其灵活性。
#### 定义泛型结构体
为了展示如何将结构体与泛型结合起来,在下面的例子中定义了一个名为 `BaseModel` 的泛型结构体来表示任何类型的实体:
```go
type BaseModel[ID any, T any] struct {
ID ID `json:"id"`
Entity T `json:"-"`
}
```
这里有两个类型参数:一个是用于唯一标识记录的 `ID` 类型;另一个则是实际存储业务数据的对象类型 `T`。这种设计允许同一个基类适用于不同种类的数据表而无需重复编码逻辑[^4]。
#### 实现基本 CRUD 方法
接下来为上述泛型结构体添加一些常用的操作方法,比如查询单条记录(`Detail`)、保存新纪录 (`Create`) 等等:
```go
package repository
import (
"gorm.io/gorm"
)
// BaseMapper 提供了一组针对特定实体的基本CRUD功能.
type BaseMapper[T any] struct{}
// Detail 查询指定条件下的第一条匹配项.
func (mapper *BaseMapper[T]) Detail(db *gorm.DB, condition map[string]interface{}) (*T, error) {
var result T
if err := db.Where(condition).First(&result).Error; err != nil {
return nil, err
}
return &result, nil
}
// Create 向数据库插入一条新的记录.
func (mapper *BaseMapper[T]) Create(db *gorm.DB, entity *T) error {
return db.Create(entity).Error
}
```
此部分展示了怎样基于泛型构建一个通用的基础映射器(Base Mapper),它能处理任意给定类型的持久化需求而不局限于某一种具体的数据结构。
#### 应用实例
假设有一个用户(User) 表格对应的 Go Struct 如下所示:
```go
type User struct {
ID uint `json:"id" gorm:"primaryKey"`
Name string `json:"name"`
Email string `json:"email"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
```
现在可以通过继承之前定义好的 `BaseModel` 来快速搭建起一套完整的用户管理模块:
```go
var userRepo = new(BaseMapper[User])
func GetUserByID(id int) (*User, error){
return userRepo.Detail(mysql.Client, map[string]interface{}{"id": id})
}
func CreateUser(user *User) error{
return userRepo.Create(mysql.Client,user)
}
```
通过这种方式不仅减少了样板代码的数量同时也提高了系统的扩展性和维护效率[^3]。
阅读全文
相关推荐


















