golang 中的通用处理 CRUD 操作
Generic handling CRUD actions in golang
我正在尝试创建视图来处理我的 gorm 模型上的所有基本 CRUD 操作。
目标是将模型传递给视图并让所有魔法发生。
我找到了关于使用反射的主题,所以我做了,但也读到那不是 "golang way"。
我遇到的第一个问题是总是使用 gorm "value" table。因此,临时解决方案是强制使用 "users" table 或 table 来自 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 在数据库中查找行(从 gorm 日志中知道)。但是 json 不要丢弃它们 - 猜测它的类型错误并且无法处理。
任何想法如何处理这个问题?
如果您还有其他解决CRUD视图问题的方案,我也将不胜感激。
问题源于 json 包处理 reflect.Value
与预期不符的事实。您可以在此处找到类似的讨论:https://github.com/golang/go/issues/7846
如您在以下代码片段中所见,reflect.MakeSlice
return 是一个类型 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
时,它将 return 一个对象,而不是数组:
Json: {}
Error: <nil>
您需要使用.Interface()
返回Value
的界面:
jsonBytes, err := json.Marshal(slice_empty_reflect_make.Interface())
这是
伪装的副本
我正在尝试创建视图来处理我的 gorm 模型上的所有基本 CRUD 操作。 目标是将模型传递给视图并让所有魔法发生。
我找到了关于使用反射的主题,所以我做了,但也读到那不是 "golang way"。
我遇到的第一个问题是总是使用 gorm "value" table。因此,临时解决方案是强制使用 "users" table 或 table 来自 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 在数据库中查找行(从 gorm 日志中知道)。但是 json 不要丢弃它们 - 猜测它的类型错误并且无法处理。 任何想法如何处理这个问题?
如果您还有其他解决CRUD视图问题的方案,我也将不胜感激。
问题源于 json 包处理 reflect.Value
与预期不符的事实。您可以在此处找到类似的讨论:https://github.com/golang/go/issues/7846
如您在以下代码片段中所见,reflect.MakeSlice
return 是一个类型 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
时,它将 return 一个对象,而不是数组:
Json: {}
Error: <nil>
您需要使用.Interface()
返回Value
的界面:
jsonBytes, err := json.Marshal(slice_empty_reflect_make.Interface())
这是