首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在golang中通用处理CRUD操作

在golang中通用处理CRUD操作
EN

Stack Overflow用户
提问于 2019-01-07 14:01:05
回答 1查看 1K关注 0票数 0

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

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

我要讨论的第一个问题是gorm总是使用"value“表。因此,临时解决方案是强制使用CommonView中的“用户”表或表名。

代码语言:javascript
复制
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))
}

模型:包装模型

代码语言:javascript
复制
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视图的问题,我也会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-07 15:56:03

问题产生于这样一个事实,即json包处理的reflect.Value并不像预期的那样。您可以在这里找到类似的讨论:https://github.com/golang/go/issues/7846

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

代码语言:javascript
复制
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())

这产生了:

代码语言:javascript
复制
Type of reflect.MakeSlice(): Value

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

代码语言:javascript
复制
Json: {}
Error: <nil>

您需要使用Value返回到.Interface()接口。

代码语言:javascript
复制
jsonBytes, err := json.Marshal(slice_empty_reflect_make.Interface())

这是一个伪装成How do I serialize a map of type [string]reflect.Value?的复制品

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54075855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档