golang结构体转map
在Golang中,可以通过将结构体转换为JSON字符串,再将JSON字符串转换为map的方式来实现结构体转换为map的功能。具体步骤如下:
1.定义结构体类型并初始化结构体变量:
type sign struct {
Name string `json:"name,omitempty"`
Age int `json:"age,omitempty"`
}
var s sign
s.Name = "csdn"
s.Age = 18
2.将结构体转换为JSON字符串:
str, err := json.Marshal(s)
if err != nil {
return
}
3.将JSON字符串转换为map:
var data = make(map[string]interface{})
if err := json.Unmarshal(str, &data); err != nil {
return
}
fmt.Println(data)
输出结果为:map[age:18 name:csdn]
golang 结构体转map
在 Go 语言中,可以使用反射机制将结构体转换为 map
类型。具体实现如下:
import (
"reflect"
)
type User struct {
Name string
Age int
}
func structToMap(s interface{}) map[string]interface{} {
result := make(map[string]interface{})
value := reflect.ValueOf(s)
typ := reflect.TypeOf(s)
for i := 0; i < value.NumField(); i++ {
fieldName := typ.Field(i).Name
fieldValue := value.Field(i).Interface()
result[fieldName] = fieldValue
}
return result
}
func main() {
user := User{Name: "Alice", Age: 20}
m := structToMap(user)
fmt.Printf("map: %v\n", m)
}
在上述示例中,我们定义了一个 User
结构体,并实现了一个 structToMap
函数,用于将结构体转换为 map
类型。在函数中,使用反射获取结构体的字段名和字段值,并将其存储到 map
中,最终返回结果。
需要注意的是,反射机制的性能开销较大,因此在大量使用时需要考虑性能问题。此外,该方法只能转换结构体中的公有字段,私有字段无法获取。
golang 结构体 泛型
结合使用结构体与泛型
在 Go 语言中,自版本 1.18 起引入了对泛型的支持,这使得开发者能够编写更加灵活和可重用的代码[^2]。当涉及到数据库操作时,利用泛型可以显著简化模型层的设计并增强其灵活性。
定义泛型结构体
为了展示如何将结构体与泛型结合起来,在下面的例子中定义了一个名为 BaseModel
的泛型结构体来表示任何类型的实体:
type BaseModel[ID any, T any] struct {
ID ID `json:"id"`
Entity T `json:"-"`
}
这里有两个类型参数:一个是用于唯一标识记录的 ID
类型;另一个则是实际存储业务数据的对象类型 T
。这种设计允许同一个基类适用于不同种类的数据表而无需重复编码逻辑[^4]。
实现基本 CRUD 方法
接下来为上述泛型结构体添加一些常用的操作方法,比如查询单条记录(Detail
)、保存新纪录 (Create
) 等等:
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 如下所示:
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
来快速搭建起一套完整的用户管理模块:
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]。
相关推荐

















