2017-11-07 3 views
2

일부 선택적 필드가있는 쿠폰 양식을 작성 중입니다.Golang 구조체에서 omitempty 플래그로 몽고 필드를 업데이트하는 방법

서론

모든 폼 필드 값이 Golang 구조로 JSON로서 수신 및 매핑된다. 구조에서 모든 필드에 "omitempty"플래그를 추가했습니다. 따라서 해당 값만 포함 된 양식 값만 매핑되고 나머지 값은 0, "", false는 구조에서 무시됩니다.

  1. I는 최초로이 양식을 저장은 적절한 형태의 값이 MongoDB를에 저장되어

    여기

    type Coupon struct { 
        Id    int `json:"id,omitempty" bson:"_id,omitempty"` 
        Name    string `json:"name,omitempty" bson:"name,omitempty"` 
        Code    string `json:"code,omitempty" bson:"code,omitempty"` 
        Description  string `json:"description,omitempty" bson:"description,omitempty"` 
        Status   bool `json:"status" bson:"status"` 
        MaxUsageLimit int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"` 
        SingleUsePerUser bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"` 
    } 
    

    이 문제 Golang 구조를이다.

  2. 이제 해당 양식을 업데이트하고 데이터 저장시 확인 된 확인란이 있다고 가정합니다. 양식을 업데이트하는 동안 확인란이 선택 취소되고 양식이 저장되도록 제출됩니다. 이제 구조체에 "omitempty"플래그를 적용 했으므로 빈 값을 확인란 필드에 매핑하지 않습니다. 값은 구조체에 매핑되지 않으므로 데이터베이스에 저장되지 않습니다.

  3. 사용자가 두 번째로 양식을 편집하면 체크 된 것과 동일한 확인란이 표시됩니다. (하지만 실제 값은 DB에 업데이트되어야하며 확인란은 선택하지 않아야합니다.)

  4. REST API에서 동일한 양식 데이터 (JSON 형식)를 사용하고 있습니다. API에서 양식 데이터를 업데이트하는 동안 필요한 값만 언급하고 업데이트하지 않으려는 값을 전달하지 않으면 MongoDB가 전체 문서를 제공된 필수 값으로 재정의합니다 (값이 또한 API에서 전달하지 않고 업데이트하지 않으려는 경우에도 재정의됩니다.)

요구 사항 :

미래에, 내가 REST API를 노출 할, 그래서 난이 일이 일어난 싶지 않아. 그래서 구조체 필드에서 "omitempty"플래그를 제거하고 싶지 않습니다.

구조체에 omitempty 플래그를 사용하는 동안 빈 양식 값 또는 API 데이터 필드를 DB에 저장하는 방법이 있습니까?

감사합니다. falsetrue :

type Coupon struct { 
    Id    int `json:"id,omitempty" bson:"_id,omitempty"` 
    Name    string `json:"name,omitempty" bson:"name,omitempty"` 
    Code    *string `json:"code,omitempty" bson:"code,omitempty"` 
    Description  string `json:"description,omitempty" bson:"description,omitempty"` 
    Status   *bool `json:"status" bson:"status"` 
    MaxUsageLimit int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"` 
    SingleUsePerUser bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"` 
} 

을 다음과 같이

답변

2

를 작동하는 방법을 설명하는 좋은 기사가있다 omitempty 사용하여 포인터를 사용해야합니다. 그리고 bool 필드로 세 가지 상태를 "통신"하려는 경우, 즉 필드를 업데이트하지 않으려면 필드를 false으로 설정하고 필드를 true으로 설정합니다. 이것은 분명히 불가능합니다.

같은 일이 int 값이됩니다. 0 값은 필드를 업데이트하지 않고 0으로 설정하는 두 가지 선택을 나타낼 수 없습니다. 당신이 그것을 작동하도록 한 후, 태그 값에 omitempty 옵션을 유지하려면

, 당신은 포인터로 필드를 변경해야합니다 :

type Coupon struct { 
    Id    *int `json:"id,omitempty" bson:"_id,omitempty"` 
    Name    string `json:"name,omitempty" bson:"name,omitempty"` 
    Code    string `json:"code,omitempty" bson:"code,omitempty"` 
    Description  string `json:"description,omitempty" bson:"description,omitempty"` 
    Status   *bool `json:"status" bson:"status"` 
    MaxUsageLimit *int `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"` 
    SingleUsePerUser *bool `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"` 
} 

작동 방법은 포인터가 nil 경우 그 (이것은 "omitempty" 옵션입니다). 필드가 nil 포인터가 아닌 경우 포인터가 뾰족한 값으로 업데이트됩니다.

예를 들어 bool 필드를 제외하려는 경우 *bool 값은 /nil이어야합니다. false으로 설정/업데이트하려면 false 값에 대한 포인터 여야합니다. true으로 설정/업데이트하려면 true 값에 대한 포인터 여야합니다.

일반적으로 zero value이 가능하고 계산해야하는 모든 유형은 포인터로 지정하면 "0 값"이고 "입력 값이 누락되었습니다"만 처리 할 수 ​​있습니다. nil 포인터의 값은 "입력에서 누락 된"경우를 나타내며, 비 - nil 0 값 포인터는 "0 값인"경우를 나타냅니다. 따라서 위의 예에서 string 필드가 빈 문자열 값 ("")을 사용할 수도있는 경우 포인터를 만들어야합니다.

사용자 지정 마샬링 및 마샬링 논리를 사용하여이 작업을 수행 할 수도 있지만 더 복잡하고 포인터를 사용하면이 작업이 자동으로 수행됩니다.

관련 문제