猿问

创建具有类型接口的映射以通过 URL 参数接受任意数据类型

我想将 URL 参数从字符串转换为正确的数据类型并将其存储在地图中。我认为类型应该是 []interface,用于存储多种数据类型的列表。


我正在创建一个键值存储,但目前它只存储字符串。我已经阅读了关于将数据转换为字节的 GOB,但不明白。


我已经尝试过类型断言,但是,我不相信在我的情况下这会起作用,因为数据来自默认情况下已经是字符串的 URL。如何检测条目是否为字符串、整数、布尔值等?


地图:


var data map[string][]string 

主函数中的 handleFunc 调用 handleCreate 函数


r.HandleFunc("/insert/{key}/{value}", handleCreate).Methods("POST")  

handleFunc 函数


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 存储为带有键 'cash' 的 int 类型


开满天机
浏览 104回答 2
2回答

弑天下

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

慕娘9325324

查看此包,它将 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.Requestdecoder := 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,它将相应地设置结构字段。如果您对字段的类型一无所知,那么您必须尝试解析为不同的类型并进行检查。
随时随地看视频慕课网APP

相关分类

Go
我要回答