为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
开满天机 2023-06-01 14:13:38
我想将 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 类型
查看完整描述

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

}


查看完整回答
反对 回复 2023-06-01
?
慕娘9325324

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,它将相应地设置结构字段。


如果您对字段的类型一无所知,那么您必须尝试解析为不同的类型并进行检查。


查看完整回答
反对 回复 2023-06-01
  • 2 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信