因此,我有一个Struct,用于保存具有AddedByUser
且链接到我的User Struct的数据。
我想要做的是从UserLevel
中删除AddedByUser
现在,我只想从此功能开始执行此操作,因此不能使用json:"-"
。它将从所有json输出中删除它。我只想从这一功能中删除它。
我还应该说这是Gorm模型,当我尝试删除10
选项(UserLevels)时,它仅从所有数据中删除了外部数据集,而不是UserLevel。
{
"ID": 1,
"CreatedAt": "2019-01-08T16:33:09.514711Z",
"UpdatedAt": "2019-01-08T16:33:09.514711Z",
"DeletedAt": null,
"UUID": "00000000-0000-0000-0000-000000000000",
"Title": "title000",
"Information": "info999",
"EventDate": "2006-01-02T15:04:05Z",
"AddedByUser": {
"ID": 2,
"CreatedAt": "2019-01-08T15:27:52.435397Z",
"UpdatedAt": "2019-01-08T15:27:52.435397Z",
"DeletedAt": null,
"UUID": "b019df80-a7e4-4397-814a-795e7e84b4ca",
"Firstname": "Me",
"Surname": "admin",
"Password": "....",
"Email": "admin@email.co.uk",
"UserLevel": {
"ID": 0,
"CreatedAt": "0001-01-01T00:00:00Z",
"UpdatedAt": "0001-01-01T00:00:00Z",
"DeletedAt": null,
"LevelTitle": "",
"UserLevel": null
},
这就是我尝试过的,
data := []models.MyData{}
data = append(data[0:2])
我大约有14个结果,没有添加它会加载所有结果,但是这只会加载两个结果。想法是删除UpdateAt
或Title
。因为我不确定gorm模型信息是否全部为0或切片将其视为0、1、2、3、4等。
我也尝试遍及模型切片,虽然可以访问每个部分,但似乎找不到一种简单的方法来按名称删除结构中的数据?地图似乎有,但我不确定为什么?
谢谢。
更新
这是我正在使用的模型:
//Model
type MyData struct {
gorm.Model
UUID uuid.UUID
Title string
Information string
EventDate time.Time
AddedByUser Users `gorm:"ForeignKey:added_by_user_fk"`
AddedByUserFK uint
}
//Users Model
type Users struct {
gorm.Model
UUID uuid.UUID
Firstname string
Surname string
Password string
Email string
UserLevel UserLevels `gorm:"ForeignKey:user_level_fk" json:",omitempty"`
UserLevelFK uint
}
答案 0 :(得分:2)
如注释中所述,您不能从结构值中删除字段,因为这会产生不同类型的值。
但是,您可以将字段设置为零值。与omitempty
JSON标记结合使用,您可以从JSON编码中排除字段。为了使其正常工作,您必须将UserLevel
字段更改为指针类型(否则最终将在JSON文档中出现空对象)。
为简洁起见,类型已缩短:
package main
import (
"encoding/json"
"fmt"
)
type MyData struct {
Title string
AddedByUser Users
}
type Users struct {
ID int
UserLevel *UserLevels `json:",omitempty"` // pointer type with omitempty
}
type UserLevels struct {
LevelTitle string
}
func main() {
var x MyData
x.Title = "foo"
x.AddedByUser.ID = 2
x.AddedByUser.UserLevel = &UserLevels{}
f(x)
b, _ := json.MarshalIndent(x, "", " ")
fmt.Println("main:\n" + string(b))
}
func f(x MyData) {
// "unset" UserLevel. Since we are receiving a copy of MyData, this is
// invisible to the caller.
x.AddedByUser.UserLevel = nil
b, _ := json.MarshalIndent(x, "", " ")
fmt.Println("f:\n" + string(b))
}
// Output:
// f:
// {
// "Title": "foo",
// "AddedByUser": {
// "ID": 2
// }
// }
// main:
// {
// "Title": "foo",
// "AddedByUser": {
// "ID": 2,
// "UserLevel": {
// "LevelTitle": ""
// }
// }
// }
在操场上尝试:https://play.golang.org/p/trUgnYamVOA
或者,您可以定义排除AddedByUser字段的新类型。但是,由于该字段不是顶级字段,因此需要进行大量工作,当将新字段添加到原始类型时,很容易忘记更新这些类型。
如果该字段位于顶层,则编译器将为您完成大部分工作,因为仅其字段标记不同的类型可以直接相互转换:
type MyData struct {
ID int
Title string
}
func main() {
var x MyData
x.ID = 1
x.Title = "foo"
f(x)
}
func f(x MyData) {
type data struct { // same as MyData, except the field tags
ID int
Title string `json:"-"`
}
b, _ := json.MarshalIndent(data(x), "", " ")
fmt.Println("main:\n" + string(b))
}