Golang将map键设置为其值的变量

时间:2015-08-14 01:48:31

标签: mysql go

我需要查看html表单输入值并将它们放入mysql数据库中。我目前正在使用r.Form来获取地图。因此,我不必为每个有效的r.Form.Get("date")使用,但是当我尝试将值放入数据库时​​。它编译得很好但我在浏览器中点击提交后得到sql: converting argument #0's type: unsupported type []string, a slice。我可以通过

解决这个问题
`date := strings.Join(m["date"], "")`

但是为30多个值执行此操作,特别是因为某些已提交的值将使用html模板从以前的数据库条目创建。如果我必须更改或添加更多以后似乎必须有一个更有效的方式,我见过for key, val := range m {}但不幸的是我只做了大约一个星期,我无法弄清楚如何保持这些值并在每次迭代后更改它们设置的变量。那就是

之后
for key, val := range m {
x := m[key]
}

这样它就会推出等效的

keyname := keyvalue

每次更改键名与地图中的键名相同,即

date := 2015-8-13
time := 18:56:11

或者如果有更简单的方法解决这个错误,那么为每个错误创建一个变量。

1 个答案:

答案 0 :(得分:1)

HTML表单可以包含单个键的多个值。这就是请求表单字段被定义为字符串切片的映射的原因。 request Form声明为

 Form url.Values

url.Values被声明为

  type Values map[string][]string

您可以使用以下方式访问密钥的第一个值:

   var value string
   if values := req.Form[key]; len(values) > 0 {
      value = values[0]
   }

url.Values Get帮助器方法将此代码简化为:

   value := req.Form.Get(key)

http.Request FormValue辅助方法简化了一点:

  value := req.FormValue(key)

使用以下方法迭代键和值:

  for key, values := range req.Form {
     for _, value := range values {
         fmt.Println(key, value)
     }
  }

如果要迭代密钥的第一个值,请使用以下代码:

 for key, values := range req.Form {
    if len(values) > 0 {
       value := values[0]
       fmt.Println(key, value)
    }
 }

在访问req.Form之前,请调用req.ParseForm来解析查询字符串和请求正文。