go - 创建具有类型接口的地图以通过 URL 参数接受任意数据类型
问题描述
我想将 URL 参数从字符串转换为正确的数据类型并将其存储在地图中。我认为类型应该是 []interface,用于存储多种数据类型的列表。
我正在创建一个键值存储,但目前它只存储字符串。我已经阅读了 GOB 以将数据转换为字节,但不明白。
我已经尝试过类型断言,但是,我不相信在我的情况下这会起作用,因为数据来自默认情况下已经是字符串的 URL。如何检测条目是否为字符串、整数、布尔值等?
地图:
var data map[string][]string
调用 handleCreate 函数的主函数中的 handleFunc
r.HandleFunc("/insert/{key}/{value}", handleCreate).Methods("POST")
处理函数函数
func handleCreate(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
k := params["key"]
v := params["value"]
data[k] = append(data[k], v)
fmt.Fprintf(w, "KEY: %v: VALUE: %v was inserted into the key-value store successfully", k, v)
}
完整代码的链接:
https://github.com/RipRoss/TrainingProjects/blob/master/main.go
预期的结果是将 URL 中给出的值存储为它的预期用途。例如 /dog/Zeus 会将 Zeus 存储为字符串,键为“dog”,/cash/1000 将 1000 存储为 int 类型,键为“cash”
解决方案
我已经尝试过类型断言,但是,我不相信在我的情况下这会起作用,因为数据来自默认情况下已经是字符串的 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
为真,则表示将此字符串解析为整数是成功的。
该GenericValue
结构仍然保存原始输入字符串,因此您可以使用它来检查该值是否为整数并对其执行某些操作,或者检查它是否为字符串并执行其他操作
var v = ParseGenericValue("2")
if v.IntegerOK {
// do something with v.Integer
} else {
// maybe just handle v.String in a different way
}
推荐阅读
- javascript - 给出不同的单词或者
- oracle - 它不工作。任何人都可以帮我解决它吗?
- python - 如何将字典输出为 csv 文件:同一列中的键和值
- regex - 如何从python3中字典中的列表中删除字符
- database - 从 CLI 使用 Cassandra 创建列族问题
- c# - Azure 是否有用于应用服务域和 SSL 测试的沙箱?
- php - 当站点用户使用 php 出现 404 错误时,如何找到尝试的 URL?
- node.js - admin.auth().verifyIdToken(idToken) 错误:在 8.0.0 之后无法使用 firebase-admin 加载默认凭据
- python - 最近邻算法?
- android - Android Firebase 检索每个孩子的前 2 个值