Go 从结构中删除元素,但仅针对这一个函数
因此,我有一个保存数据的结构,它有一个链接到我的用户结构的Go 从结构中删除元素,但仅针对这一个函数,go,Go,因此,我有一个保存数据的结构,它有一个链接到我的用户结构的addedbyser 我希望能够做到的是从AddedByUser 现在我只想通过这个函数来实现,所以使用json:“-”不是一个选项。这将从所有json输出中删除它。我只想从这个函数中删除它 我还应该说,这些是Gorm模型,当我试图删除10选项(UserLevels)时,它只从所有数据中删除外部数据集,而不是UserLevel { "ID": 1, "CreatedAt": "2019-01-08T16:33:09.514
addedbyser
我希望能够做到的是从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个结果,不带append,它将加载所有结果,但使用is只加载两个结果。想法是删除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
}
如注释中所述,不能从结构值中删除字段,因为这样会产生不同类型的值 但是,可以将字段设置为零值。结合
ommitempty
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": ""
// }
// }
// }
在操场上试一试:
或者,您可以定义排除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))
}
如注释中所述,不能从结构值中删除字段,因为这样会产生不同类型的值 但是,可以将字段设置为零值。结合
ommitempty
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": ""
// }
// }
// }
在操场上试一试:
或者,您可以定义排除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))
}
不能从结构值中删除字段,因为这是其类型的一部分。但是,您可以将其设置为零值。这是Go的一部分吗?因为这太愚蠢了,我应该能够控制每个函数的信息流,而不仅仅是每个静态类型语言的全部或全部,而不仅仅是Go。您应该将类型定义添加到问题中,以获得问题的具体解决方案。构建另一个结构怎么样?不添加级别,然后只导入我想要显示的内容?不确定这是否可能?当然可能,这是一个有效的解决方案。但是,如果这是最简单的解决方案,则取决于您的类型定义,这就是为什么您应该将它们添加到问题中。也包括
Users
类型。不能从结构值中删除字段,因为这是其类型的一部分。但是,您可以将其设置为零值。这是Go的一部分吗?因为这太愚蠢了,我应该能够控制每个函数的信息流,而不仅仅是每个静态类型语言的全部或全部,而不仅仅是Go。您应该将类型定义添加到问题中,以获得问题的具体解决方案。构建另一个结构怎么样?不添加级别,然后只导入我想要显示的内容?不确定这是否可能?当然可能,这是一个有效的解决方案。但是,如果这是最简单的解决方案,则取决于您的类型定义,这就是为什么您应该将它们添加到问题中。也包括用户
类型。非常感谢-感谢似乎是我想要的。我没有考虑将userlevels包含为指针。非常感谢!万分感谢——感谢似乎是我想要的。我没有考虑将userlevels包含为指针。非常感谢!