Мартини привязка не работает

Я играю с Мартини, и по какой-то причине я не могу заставить работать пакет связывания для Contribute.

Моя структура не имеет связанных значений. Я сократил код до его самой простой формы, но он все еще не работает.

Кто-нибудь может увидеть, что я делаю не так?

package main

import (
    "github.com/go-martini/martini"
    "github.com/martini-contrib/binding"
    "net/http"
)

var html string = `<form method="POST" enctype="application/x-www-form-urlencoded"><input name="un" type="text" /><input type="submit" value="Some button" /></form>`

type FormViewModel struct {
    Username string `form: "un"`
}

func main() {
    m := martini.Classic()

    m.Get("/", func(w http.ResponseWriter) {
        w.Header().Add("content-type", "text/html")
        w.Write([]byte(html))
    })

    m.Post("/", binding.Form(FormViewModel{}), func(vm FormViewModel) string {
        return "You entered: " + vm.Username
    })

    m.Run()
}

1 ответ

Решение

Это просто проблема синтаксического анализа в определении тега, связанного с полем структуры.

Вам нужно удалить пустой символ после формы:

Если вы напишите структуру следующим образом:

type FormViewModel struct {
    Username string `form:"un"`   // No blank after form:
}

... это должно работать лучше.

Спецификация языка Go гласит:

По соглашению строки тегов представляют собой конкатенацию необязательно разделенных пробелами пар "значение". Каждый ключ является непустой строкой, состоящей из неуправляемых символов, кроме пробела (U+0020 ' '), кавычки (U+0022 '"') и двоеточия (U+003A ':'). Каждое значение заключено в кавычки используя символы "+" U + 0022 и буквенный синтаксис строки Go.

По-видимому, синтаксический анализатор, реализованный в пакете отражения, не переносит пробел после двоеточия.

Другие вопросы по тегам