Golang解析形式

If I have the following form setup:

{{ range $key, $value := .Scores }}
    <input id="{{$value.Id}}_rating__1" type="radio" name="rating[{{$value.Id}}]" value="-1">
    <input id="{{$value.Id}}_rating__0" type="radio" name="rating[{{$value.Id}}]" value="0">
    <input id="{{$value.Id}}_rating__2" type="radio" name="rating[{{$value.Id}}]" value="+1">
{{ end }}

How can I then extract that data correctly? Knowing that there .Scores can contain multiple structs

func categoryViewSubmit(w http.ResponseWriter, r *http.Request) {
    err := r.ParseForm()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("POST")

    fmt.Printf("%+v
", r.Form()) // annot call non-function r.Form (type url.Values)
    fmt.Printf("%+v
", r.FormValue("rating")) // Returns nothing
}

The form keys look like rating[id] where id is a value identifier. To get one of the values, call r.FormValue("rating[id]") after substituting id for an actual id value.

I suggest printing the form to see what's going on:

fmt.Printf("%+v
", r.Form)  // No () following Form, Form is not a function

The form is an url.Values. An url.Values is a map[string][]string. You can iterate through the form as follows:

for key, values := range r.Form {   // range over map
  for _, value := range values {    // range over []string
     fmt.Println(key, value)
  }
}

For others that are looking answers for this I found Gorilla's schema really helpful. It allows you to parse forms to structs and has support for arrays and nested structs. When you combine that with guregu's null package you can easily parse sructs with optional fields.

Example Go:

package models

import (
    "github.com/gorilla/schema"
    "gopkg.in/guregu/null.v3"
)

type User struct {
    Id            null.Int    `db:"id" json:"id"`
    // Custom mapping for form input "user_name" 
    Name          string      `db:"user_name" json:"user_name" schema:"user_name"`
    EmailAddress  string      `db:"email_address" json:"email_address"`
    OptionalField null.String `db:"optional_field" json:"optional_field"`
}

Example html

<form>
    <input type="text" name="user_name">
    <input type="text" name="EmailAddress">
    <input type="text" name="OptionalField">
</form>