Here is my validation structure:
type PostEmail struct {
Username string `json:"username" validate:"required"`
Email string `json:"email" validate:"required"`
IsRefreshEmail *bool `json:"isRefreshEmail" validate:"required"`
}
I'm pointing the value of IsRefreshEmail with *bool. If I remove the pointer and I try to call my API without it, the API will throw a bad syntax error.
That will happen only if the boolean value will be false. If it's true even if you remove the pointer the API will respond correctly.
Why is this happening? It's normal? I can't understand it and i don't even know if I'm doing it wrong with the pointer. What I surely know is that if I remove the * from bool and I insert false as value in postman for the field isRefreshEmail the API will throw an exception.
Someone can explain please? Thank you.
CodePudding user response:
A boolean can represent two values, false or true:
var IsRefreshEmail bool
A boolean pointer can represent three values, false, true or nil:
var IsRefreshEmail *bool
The benefit of this, is that you can compare false with nil:
{"email": "hello", "isRefreshEmail": false}
{"email": "hello"}
without the pointer, the two JSON above will be identical after Unmarshal. Depending on your situation, you might not care about that. However if you need to know if the value was omitted, then pointer is required.
CodePudding user response:
Default value of bool is false
Default value of *bool is nil
So when using with pointer and the value you send is false -> fasle
But when use with bool -> you send false -> validate with check and make it failure validation(same as default value)
The problem is same for int and *int with the 0 value
