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

11个月前 评论
renxiaotu (作者) 11个月前
Scrooge (楼主) 11个月前
讨论数量: 5

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

11个月前 评论
Scrooge (楼主) 11个月前

file

11个月前 评论
renxiaotu (作者) 11个月前
Scrooge (楼主) 11个月前