2 回答
TA贡献1818条经验 获得超8个赞
我已经尝试过类型断言,但是,我不相信在我的情况下这会起作用,因为数据来自默认情况下已经是字符串的 URL。如何检测条目是否为字符串、整数、布尔值等?
一般来说,让事情变得过于动态并不是一个好主意(使事情的推理变得比需要的更复杂)。最好定义一个结构,然后将值读入其中。
也就是说,如果我们坚持你问题的措辞,你可以做一些事情:
例如,创建一个可以存储一个值的多个版本的通用类型,以及一个标志来指示它是否正确解析为该类型:
type GenericValue struct {
String string
Integer int
IntegerOK bool
Float float64
FloatOK bool
Boolean bool
BooleanOK bool
}
func ParseGenericValue(v string) GenericValue {
var result GenericValue
var err error
result.String = v
result.Integer, err = strconv.Atoi(v)
result.IntegerOK = err == nil
result.Float, err = strconv.ParseFloat(v, 64)
result.FloatOK = err == nil
result.Boolean, err = strconv.ParseBool(v)
result.BooleanOK = err == nil
return result
}
所有这一切都是使用strconv包尝试将输入字符串解析为整数/浮点数/布尔值,如果解析成功,它会生成相应的字段OK。例如,如果IntegerOK为 true 则表示将此字符串解析为整数成功。
该GenericValue结构仍保留原始输入字符串,因此您可以使用它来检查此值是否为整数并对其执行某些操作,或者检查它是否为字符串并执行其他操作
var v = ParseGenericValue("2")
if v.IntegerOK {
// do something with v.Integer
} else {
// maybe just handle v.String in a different way
}
TA贡献1783条经验 获得超4个赞
查看此包,它将 URL 参数转换为具有预期字段的结构。当然,当您知道预期的数据类型时,这很有用。
例如
type ServiceInput struct {
Latitude float64 `schema:"latitude,required"` //add validations too
Longitude float64 `schema:"longitude"`
}
...
r := new(ServiceInput)
urlParams := request.URL.Query() //request is http.Request
decoder := schema.NewDecoder()
if err := decoder.Decode(r, urlParams); err != nil {
return nil, lib.ErrBadRequest{Err: err}
}
现在假设请求为 GET /foo/bar?latitude=1.2&longitude=3.4,它将相应地设置结构字段。
如果您对字段的类型一无所知,那么您必须尝试解析为不同的类型并进行检查。
- 2 回答
- 0 关注
- 103 浏览
添加回答
举报