为了账号安全,请及时绑定邮箱和手机立即绑定

golang 中的通用处理 CRUD 操作

golang 中的通用处理 CRUD 操作

Go
慕标琳琳 2023-06-01 10:01:19
我正在尝试创建视图来处理我的 gorm 模型上的所有基本 CRUD 操作。目标是将模型传递给视图并让所有的魔法发生。我找到了关于使用反射的主题,所以我做了,但也读到那不是“golang 方式”。我遇到的第一个问题是总是使用“值”表的 gorm。因此,临时解决方案是强制使用“用户”表或表名CommonViewpackage controllersimport (    "encoding/json"    "fmt"    "github.com/jinzhu/gorm"    "net/http"    "reflect")type CommonView struct {    db        *gorm.DB    modelType reflect.Type    model     interface{}    tableName string}func NewCommonView(db *gorm.DB, model interface{}, tableName string) *CommonView {    return &CommonView{        db:        db,        modelType: reflect.TypeOf(model),        model:     model,        tableName: tableName,    }}func (cv *CommonView) HandleList(w http.ResponseWriter, r *http.Request) {    modelSliceReflect := reflect.SliceOf(cv.modelType)    models := reflect.MakeSlice(modelSliceReflect, 0, 10)    fmt.Println(modelSliceReflect)    fmt.Println(models)    //modelsDirect := reflect.MakeSlice(reflect.TypeOf(cv.model), 0, 0)    cv.db.Table("users").Find(&models)    fmt.Println("From db: ")    fmt.Println(models)    modelType := reflect.TypeOf(modelSliceReflect)    fmt.Println("Type name: " + modelType.String())    modelsJson, _ := json.Marshal(models)    fmt.Fprint(w, string(modelsJson))}型号:包款import "golang.org/x/crypto/bcrypt"type User struct {    Id        string `json:"id" gorm:"type:uuid;primary_key;default:uuid_generate_v4()"`    FirstName string `json:"firstName"`    LastName  string `json:"lastName"`    Email     string `json:"email" gorm:"unique;not null"`    Password  string `json:"-"`}func (User) TableName() string {    return "user"}Gorm 在 DB 中查找行(从 gorm 日志中知道)。但是 json 不会转储它们 - 猜测它的类型错误并且无法处理。任何想法如何处理这个问题?如果您还有任何其他解决方案如何解决CRUD视图的问题,我也将非常感谢。
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

问题源于 json 包处理reflect.Value不符合预期的事实。

正如您在以下代码片段中看到的,reflect.MakeSlice返回一个类型Value,而不是一个切片。

slice_empty_reflect_make := reflect.MakeSlice(

                                    reflect.SliceOf(

                                            reflect.TypeOf(5)),

                                    10, 10)


fmt.Printf("Type of reflect.MakeSlice(): %s\n",

           reflect.TypeOf(slice_empty_reflect_make).Name())

这产生:


Type of reflect.MakeSlice(): Value

当您在 json 编组器中输入时Value,它将返回一个对象,而不是数组:


Json: {}

Error: <nil>

Value您需要使用以下命令返回到界面.Interface():


jsonBytes, err := json.Marshal(slice_empty_reflect_make.Interface())

查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 144 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信