Giá trị của bool
loại có 2 giá trị có thể có:false
và true
. Và bạn muốn "giao tiếp" 3 trạng thái khác nhau bằng bool
, cụ thể là để không cập nhật trường, để đặt trường thành false
và đặt trường thành true
. Điều này rõ ràng là không thể.
Điều tương tự cũng xảy ra với int
giá trị:giá trị 0
không thể đại diện cho 2 lựa chọn khác nhau, đó là không cập nhật trường và đặt nó thành 0
.
Nếu bạn muốn giữ omitempty
các tùy chọn trong giá trị thẻ, sau đó để làm cho nó hoạt động, bạn phải thay đổi các trường thành con trỏ:
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"`
}
Cách nó hoạt động là nếu con trỏ là nil
, nó sẽ bị bỏ trống (đây là "omitempty" quyền mua). Nếu trường không phải là nil
con trỏ, nó sẽ được cập nhật thành giá trị trỏ.
Vì vậy, ví dụ:nếu bạn muốn loại trừ một bool
rồi đến trường *bool
giá trị nên / sẽ là nil
. Nếu bạn muốn đặt / cập nhật nó thành false
, nó phải là một con trỏ đến false
giá trị. Nếu bạn muốn đặt / cập nhật nó thành true
, nó phải là một con trỏ đến true
giá trị.
Nói chung, bất kỳ loại nào có giá trị bằng không
là có thể và nên được tính bằng, bạn chỉ có thể xử lý "nó đang là giá trị 0" và "nó bị thiếu trong đầu vào" nếu bạn đặt nó là một con trỏ và nil
giá trị của con trỏ sẽ biểu thị trường hợp "bị thiếu từ đầu vào", trong khi không phải nil
con trỏ đến giá trị 0 sẽ biểu thị trường hợp "nó đang là giá trị 0". Vì vậy, trong ví dụ trên nếu chuỗi string
các trường cũng có thể nhận giá trị chuỗi trống (""
), thì bạn cũng phải làm cho chúng trở thành con trỏ.
Lưu ý rằng bạn cũng có thể đạt được điều này bằng cách sử dụng logic sắp xếp và bỏ quản lý tùy chỉnh, nhưng điều đó phức tạp hơn và việc sử dụng con trỏ sẽ tự động cung cấp cho bạn điều này.