猿问

golang 中的通用处理 CRUD 操作

我正在尝试创建视图来处理我的 gorm 模型上的所有基本 CRUD 操作。目标是将模型传递给视图并让所有的魔法发生。


我找到了关于使用反射的主题,所以我做了,但也读到那不是“golang 方式”。


我遇到的第一个问题是总是使用“值”表的 gorm。因此,临时解决方案是强制使用“用户”表或表名CommonView


package controllers


import (

    "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视图的问题,我也将非常感谢。


慕标琳琳
浏览 145回答 1
1回答

莫回无

问题源于 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())
随时随地看视频慕课网APP

相关分类

Go
我要回答