reflect反射拿不到值的疑问

为什么用reflect?:哦,这里解释下。因为是练手项目,不是实际业务,刚好学到reflect包就想用上

1. 运行环境

$ go version
go version go1.22.2 windows/amd64

2. 问题描述?

model DB

type DB struct {
  D *gorm.DB
  value string
  m any
}

model User

type UserInput struct {
    Nickname string `json:"nickname" form:"nickname" gorm:"type:string;not null;unique;comment:别名"`
  Passport string `json:"passport" form:"passport" binding:"required" gorm:"type:string;not null;unique;comment:账号"`
  Password string `json:"password" form:"password" binding:"required" gorm:"type:string;not null;comment:密码"`
  Email string `json:"email" form:"email" gorm:"type:string;not null;unique;comment:邮箱"`
  Avatar string `json:"avatar" form:"avatar" gorm:"type:string;not null;comment:头像"`
}

type UserInputCreate struct {
    Model
 UserInput
}

reflect反射拿不到值的疑问
简单的链式操作
NewDB():初始化gorm的DB
FindUSerModel():封装gorm的查询函数,的到的结赋值给d.m,d.m为一个any类型
GetColumn():根据FindUserModel()函数查询到的数据,然后传入用户名如:”tom”,最后根据传入的值和数据库查询到的数据进行对比。如果存在则赋值给d.value,如果为空则d.value = ""

    d := db.NewDB().FindUserModel(input)
    // 查找是否存在用户
    if ok := d.GetColumn(input.Passport).Exist(); !ok {
        return errors.New(userNotExist)
    }
func (d *DB) GetColumn(column string) *DB { // TODO 函数未实现
  u := d.m
 m := u.(*model.UserInputCreate)

    d.value = ""
  value := reflect.ValueOf(m)
    if value.Kind() != reflect.Struct || value.Kind() == reflect.Invalid {
       return d
  }
    for i := 0; i < value.NumField(); i++ {
       field := value.Field(i)
       if reflect.DeepEqual(field, column) {
          d.value = field.String()
          return d
  }
    }
    return d
}

reflect反射拿不到值的疑问

这里使用reflect.ValueOf获取查询到的值,奇怪的是,一直无法拿到

reflect反射拿不到值的疑问

3. 您期望得到的结果?

根据逻辑,传入一个值,然后判断结构体是否存在这个值,但是一直拿到不。

4. 您实际得到的结果?

不可读: unknown or unsupported kind: "invalid"

最佳答案

file

3周前 评论
renxiaotu (作者) 3周前
Scrooge (楼主) 3周前
讨论数量: 5

没必要用反射啊,把db查询结果转成map[string]any,遍历map取数据就好了

4周前 评论
Scrooge (楼主) 4周前

file

3周前 评论
renxiaotu (作者) 3周前
Scrooge (楼主) 3周前

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