英文:
Go - JSON validation throwing error unless I use pointer in the struct. Why?
问题
这是我的验证结构:
type PostEmail struct {
Username string `json:"username" validate:"required"`
Email string `json:"email" validate:"required"`
IsRefreshEmail *bool `json:"isRefreshEmail" validate:"required"`
}
我用 *bool
来指向 IsRefreshEmail
的值。如果我移除指针并且在调用API时没有它,API会抛出语法错误。
只有当布尔值为 false
时才会发生这种情况。如果它是 true
,即使你移除指针,API也会正确响应。
为什么会这样?这是正常的吗?我无法理解,也不知道我是否在使用指针时出错。我唯一确定的是,如果我从 bool
中移除 *
,并且在Postman中为 isRefreshEmail
字段插入 false
值,API会抛出异常。
有人可以解释一下吗?谢谢。
英文:
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.
答案1
得分: 3
一个布尔值可以表示两个值,false
或true
:
var IsRefreshEmail bool
一个布尔指针可以表示三个值,false
,true
或nil
:
var IsRefreshEmail *bool
这样做的好处是,你可以将false
与nil
进行比较:
{"email": "hello", "isRefreshEmail": false}
{"email": "hello"}
如果没有指针,上述两个JSON在解析后将完全相同。
根据你的情况,你可能不关心这一点。然而,如果你需要知道值是否被省略,则需要使用指针。
英文:
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.
答案2
得分: 2
布尔类型的默认值是false
指针类型的布尔默认值是nil
因此,当使用指针类型并且发送的值为false时,结果是false
但是当使用布尔类型并发送false时,需要进行检查并将其视为验证失败(与默认值相同)
对于整数类型和指针类型的整数,默认值都是0
英文:
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
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论