Golang Go语言中怎么判断是否传递了数值类型
Golang Go语言中怎么判断是否传递了数值类型
一个 post 请求里面的数值类型传递 0 和不传递,解析到结构体中都是 0,要怎么判断是否传递了呢
专门要判断的话就先赋值改动默认值.比如-1,应该能解决.
更多关于Golang Go语言中怎么判断是否传递了数值类型的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
解析前判断
解析前怎么判断
指针,我去翻个例子给你
值类型改成指针类型就可以了;比如 int 类型改成*int,如果不传是 nil 而不是 0。
也可以用这个库 https://github.com/mattn/go-nulltype
type NodeXXX struct {
Date string json:"date"
Count *int32 json:"count"
}
你这个需求,只能别解析到结构体里面,解析到 map 里面了
原来 V2EX 不支持 markdown 语法么
8l 那样的
解析前默认就是在 request 的 map 里的
json 格式的
json 看 6l
//GetInt 获取 int 数据,不是有效的数字则返回默然值或 0,默认值传-1
func GetInt(v interface{}, def …int) int {
value := fmt.Sprintf("%v", v)
if strings.Contains(strings.ToUpper(value), “E+”) {
var n float64
_, err := fmt.Sscanf(value, “%e”, &n)
if err == nil {
return int(n)
}
if len(def) > 0 {
return def[0]
}
}
if value, err := strconv.Atoi(value); err == nil {
return value
}
if len(def) > 0 {
return def[0]
}
return 0
}
解析到 map 怎么解析的?
目前主流的有两种办法
一种是 gin 推荐的用一个校验的 package 去做。 在结构体上用 tag 描述校验规则,如果不让为空可以直接报错。 但是这个其实达不到有些目的。
我是用的额外的结构体+指针类型。 根据是否是 nil 决定怎么赋值。
谢谢
啊我最近写项目也遇到这个问题了!确实搞起来有点麻烦,但好在有人已经写好库了,我最近一直用: https://godoc.org/gopkg.in/guregu/null.v3
思路是这样:
新建一个 struct,
type NullInt64 struct {
Int64 int64
Valid bool // Valid is true if Int64 is not NULL
}
然后给这个 struct 实现 解析 json 时需要的 MarshalJSON 那一套方法。
最终代码如下可以参考:
https://github.com/RayHY/go-isso/blob/master/internal/app/isso/server/handlers.go#L232
stackoverflow 上看到一种方法:
对承载 Unmarsha 结果的对象设定一个不可能的默认值。<br> var jsonBlob = []byte(`[<br> {"Name": "Platypus", "Order": "Monotremata"}<br> ]`)<br><br> type Animal struct {<br> Name string<br> Order string<br> ID<br> int<br> }<br><br> animals := &Animal{ID: -9999}<br> err := json.Unmarshal(jsonBlob, animals)<br> if err != nil {<br> fmt.Println("error:", err)<br> }<br> fmt.Printf("%+v", animals)<br>
原文: https://stackoverflow.com/questions/39160807/default-value-golang-struct-using-encoding-json
其实使用一个新的 struct 代替原来的类型是最实在的方法了,不 hack,很通用,最关键是这些类型也可以在 sql 库里面使用,用来区分 0 值和不存在。
简单的说就是这个: https://godoc.org/gopkg.in/guregu/null.v3#Int.UnmarshalJSON
UnmarshalJSON implements json.Unmarshaler. It supports number and null input. 0 will not be considered a null Int. It also supports unmarshalling a sql.NullInt64.
每次有人说强类型语言方便,我就想举这个例子。
我也想知道目前最好的解决办法, 我之前用了另外一个字段来标记是否有传入值, 觉得用指针好像不太优雅
强类型语言都有这个问题吧…
指针 +1
都说了用指针了,传了 null,指针就是 nil,传了数值,就是指向数值的指针
能不能学习一下再来黑?
POST body 中的数据一般不外乎 multipart form,url 编码的数据 和 json,这几类都可以在拿到 request body 之后进行解析,前两个 golang 标准库中本身就有,其实现就是个 map,json 解析到 map 直接 json.Unmarshal 就可以,文档里面有示例。
如果使用 新的 struct int来接受数据,然后又要做一道赋值转化到另外一个 struct int ?好像很多 orm 不支持 int是主键的额?
解析前赋值其它值
在Go语言中,判断一个接口值是否传递了数值类型(包括整型、浮点型等),通常是通过类型断言或者类型选择(type switch)来实现的。以下是两种常见的方法:
方法一:类型断言
类型断言可以检查接口值是否包含特定的类型。如果断言成功,则表明传递的是该类型的值;如果断言失败,则会引发panic,因此通常与_, ok
语法结合使用以避免panic。
var i interface{} = 123 // 假设这是传递的接口值
if _, ok := i.(int); ok {
fmt.Println("传递的是整型")
} else if _, ok := i.(float64); ok {
fmt.Println("传递的是浮点型")
} else {
fmt.Println("传递的不是数值类型")
}
方法二:类型选择
类型选择是处理接口值的一种更灵活的方式,可以针对多种类型进行匹配。
var i interface{} = 123.45 // 假设这是传递的接口值
switch v := i.(type) {
case int:
fmt.Println("传递的是整型:", v)
case float64:
fmt.Println("传递的是浮点型:", v)
default:
fmt.Println("传递的不是数值类型")
}
以上两种方法都可以有效地判断接口值是否传递了数值类型,根据具体需求选择合适的方法即可。在大多数情况下,类型选择(type switch)提供了更好的可读性和扩展性。