英文:
Checking for Empty Integer in Golang
问题
我正在设计一个API,用户发送整数值,根据发送的值执行某些操作。在验证检查中,我必须将该值与0进行比较,即if intValue == 0
。
然而,如果值为0,我还必须执行不同的操作。有没有办法在不将其与0进行比较的情况下检查整数是否不存在或为空?
> **注意:**要求由客户端设置,我无法更改它们。
英文:
I am designing an API where a user sends integer values and some operation is performed depending on the value sent. During the validation check that whether this value exists in the request, I have to equate it to 0 i.e. if intValue == 0
.
However, I also have to perform a different operation in case the value is 0. Is there any way I can check that the integer does not exist or is empty without equating to 0?
> Note: The requirements are set by the client and I cannot change them.
答案1
得分: 1
当将JSON数据解码为结构体时,可以通过将其声明为指针类型来区分可选字段。
例如:
type requestFormat struct {
AlwaysPresent int
OptionalValue *int
}
现在,当解码值时,可以检查该值是否被提供:
var data requestFormat
err := json.NewDecoder(request.Body).Decode(&data)
if err != nil { ... }
if data.OptionalValue == nil {
// JSON数据中未定义OptionalValue
} else {
// OptionalValue已定义,但可能为0
val := *data.OptionalValue
}
英文:
When decoding JSON data into a struct, you can differentiate optional fields by declaring them as a pointer type.
For example:
type requestFormat struct {
AlwaysPresent int
OptionalValue *int
}
Now when the value is decoded, you can check if the value was supplied at all:
var data requestFormat
err := json.NewDecoder(request.Body).Decode(&data)
if err != nil { ... }
if data.OptionalValue == nil {
// OptionalValue was not defined in the JSON data
} else {
// OptionalValue was defined, but it still may have been 0
val := *data.OptionalValue
}
答案2
得分: 0
如果考虑兼容性,我的建议是使用json.Number。这样,请求方可以传递int和string,并且还可以确定请求方是否传递了参数。
例如:
package main
import (
"encoding/json"
"fmt"
"log"
)
type Param struct {
Level json.Number `json:"level"`
}
func main() {
var p Param
if err := json.Unmarshal([]byte(`{"level": 30}`), &p); err != nil {
log.Fatalf("Unmarshal err: %v", err)
}
if p.Level == "" {
log.Fatal("level not pass")
}
level, err := p.Level.Int64()
if err != nil {
log.Fatalf("level is not integer")
}
fmt.Printf("level: %d", level)
}
英文:
If considering compatibility, my suggestion is to use json.Number. This way, both int and string can be passed by the requesting side, and it can also determine whether the requesting side has passed the parameter.
For example:
package main
import (
"encoding/json"
"fmt"
"log"
)
type Param struct {
Level json.Number `json:"level"`
}
func main() {
var p Param
if err := json.Unmarshal([]byte(`{"level": 30}`), &p); err != nil {
log.Fatalf("Unmarshal err: %v", err)
}
if p.Level == "" {
log.Fatal("level not pass")
}
level, err := p.Level.Int64()
if err != nil {
log.Fatalf("level is not integer")
}
fmt.Printf("level: %d", level)
}
答案3
得分: -2
在生产中 如@phuclv所说
不存在"空整数"这样的东西
不优雅的实现
检查是否为必需项:
例如
@Hymns For Disco 使用json.NewDecoder
或者
validators
另一种方法:
使用map而不是struct,可以判断字段是否存在
以下是一个示例
package main
import (
"encoding/json"
"io/ioutil"
"net/http"
)
type Test struct {
Name string
Age int
}
func testJson(w http.ResponseWriter, r *http.Request) {
aMap := make(map[string]interface{})
data, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(data, &aMap)
test := Test{}
json.Unmarshal(data, &test)
}
func main() {
http.HandleFunc("/", testJson)
http.ListenAndServe(":8080", nil)
}
英文:
in production as @phuclv say
there's no such thing as an "empty integer"
inelegant implementation
check if it is required:
like
@Hymns For Disco use json.NewDecoder
or
validators
but it is being abandoned:
https://stackoverflow.com/questions/31801257/why-required-and-optional-is-removed-in-protocol-buffers-3
another way:
use map but struct,which can tell if a field exists
follow is a example
package main
import (
"encoding/json"
"io/ioutil"
"net/http"
)
type Test struct {
Name string
Age int
}
func testJson(w http.ResponseWriter, r *http.Request) {
aMap := make(map[string]interface{})
data, _ := ioutil.ReadAll(r.Body)
json.Unmarshal(data, &aMap)
test := Test{}
json.Unmarshal(data, &test)
}
func main() {
http.HandleFunc("/", testJson)
http.ListenAndServe(":8080", nil)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论