2016-08-22 1 views
2

공개 및 관리자가 볼 수있는 프로젝트의 엔터티가 있습니다. 모든 필드가 공개적으로 접근 가능한 것은 아닙니다. 예를 들어구조 태그를 무시하십시오.

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 메서드에서 수동으로이 작업을 수행 할 필요가 없습니까?

답변

1

일반적으로이 반복은 embedding을 사용하여 피할 수 있습니다. 귀하의 Foo 유형 FooPublic을 포함한다 : 누군가가 누군가가 이미 Foo 또는 *Foo 값을 가지고 (그래서 내 보낸 AdminOnly 필드에 액세스 할 수 있습니다) 것으로는 Foo.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"`  
} 

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

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

그러나 경우에, 그래서 요점은 무엇인가?

더 나은 해결책은 인터페이스를 사용하고 Foo 구조체를 노출하지 않는 것입니다.

+0

감사합니다. 그것은 저를 위해 작동 해결책 인 것을 보인다. 공개 및 관리자 권한에 관해서는 앱 사용자의 역할을 의미하므로 사용자 역할에 따라 Foo 또는 FooPublic을 json으로 반환합니다. – user6743038

+0

예, 당신은'Public()'메소드를 전혀 필요로하지 않습니다. 당신이'type Foo struct {FooPublic; AdminOnly 문자열; }'그러면'foo.FooPublic'을 사용하여'var foo Foo'의 임베디드'FooPublic' 값을 얻을 수 있습니다. –

관련 문제