我在项目中有一个实体,公众和管理员都可以查看。但不是所有字段都应该被公众访问。
例如:
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"`
}
仅管理员可见的字段应仅对管理员可见。 目前,当请求来自公共时,我调用单独的方法,将每个需要的字段复制到新结构中。
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
}
但是,如果我需要向实体添加新字段,则需要在三个位置上进行添加。在结构本身中,在PublicFoo
和Public
方法中。
这似乎违反了DRY原则。这里正确的、惯用的解决方案是什么?我能否定义FooPublic
,使其覆盖所需字段的标签?或者可能有一种好的方式可以从一个结构复制相应的字段到另一个结构,这样我就不需要在Public
方法中手动完成这个操作了吗?
Public()
方法。如果你有type Foo struct { FooPublic; AdminOnly string; }
,那么你可以通过foo.FooPublic
来访问var foo Foo
的嵌入式FooPublic
值。 - Jesse Amano