首页 > 解决方案 > 创建具有类型接口的地图以通过 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”

标签: go

解决方案


我已经尝试过类型断言,但是,我不相信在我的情况下这会起作用,因为数据来自默认情况下已经是字符串的 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
}

推荐阅读