gpt4 book ai didi

json - 在 go 中覆盖结构标签

转载 作者:IT王子 更新时间:2023-10-29 01:09:42 28 4
gpt4 key购买 nike

我的项目中有一个可供公众和管理员查看的实体。并非所有字段都应该可供公众访问。

例如

type Foo struct {
Id bson.ObjectId `json:"id" bson:"_id"`
DateAdded time.Time `json:"date_added" bson:"date_added"`
Bar string `json:"bar" bson:"bar"`
AdminOnly string `json:"admin_only" bson:"admin_only"`
}

AdminOnly 字段应该只对管理员可见。现在,当请求来自公共(public)时,我调用单独的方法将每个需要的字段复制到新结构

type FooPublic struct {
Id bson.ObjectId `json:"id" bson:"_id"`
DateAdded time.Time `json:"date_added" bson:"date_added"`
Bar string `json:"bar" bson:"bar"`
}

func (f *Foo) Public() (res FooPublic) {
res = FooPublic{
Id: f.Id,
DateAdded: f.DateAdded,
Bar:f.Bar,
}
return
}

但是如果我需要向我的实体添加新字段,我需要在 3 个地方添加它。在结构本身、PublicFooPublic 方法中。
这似乎违反了 DRY 原则。什么是正确的,惯用的解决方案?我可以定义 FooPublic 以便它覆盖所需字段的标签吗?或者至少有一种好的方法可以将相应的字段从一个结构复制到另一个结构,所以我不需要在 Public 方法中手动执行此操作?

最佳答案

通常可以通过使用 embedding 来避免这种重复.您的 Foo 类型应嵌入 FooPublic:

type FooPublic struct {
Id bson.ObjectId `json:"id" bson:"_id"`
DateAdded time.Time `json:"date_added" bson:"date_added"`
Bar string `json:"bar" bson:"bar"`
}

type Foo struct {
FooPublic
AdminOnly string `json:"admin_only" bson:"admin_only"`
}

func (f *Foo) Public() FooPublic {
return f.FooPublic
}

但是,如果有人能够调用 Foo.Public(),则表明有人已经拥有 Foo*Foo 值(并且所以可以访问导出的 AdminOnly 字段),那有什么意义呢?

更好的解决方案是使用接口(interface),而不公开 Foo 结构。

关于json - 在 go 中覆盖结构标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39077015/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com