覆盖去结构标签

问题描述:

我的项目中有一个实体可以被公众和管理员查看。并非所有的字段都应该被公众访问。覆盖去结构标签

例如

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场应该只有管理员可以看到。 现在,当请求来自于公众,我称之为独立的方法副本每个需要的领域新的结构

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方法中。
这似乎是再次干燥的原则。什么是正确的,惯用的解决方案?我能否定义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场),有什么意义呢?

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

+0

谢谢。这似乎是我的工作解决方案。 当我谈到公共和管理访问时,我的意思是我的应用程序用户的角色,所以根据用户角色,我要么将Foo或FooPublic作为json返回。 – user6743038

+0

是的,你根本不需要'Public()'方法。如果你有'输入Foo struct {FooPublic; AdminOnly字符串; }'那么你可以通过'foo.FooPublic'获得'var foo Foo'的嵌入式'FooPublic'值。 –