Почему-то не могу прочитать StructTag
У меня есть этот обработчик:
func (h Handler) makeGetMany(v PeopleInjection) http.HandlerFunc {
type RespBody struct {
TypeCreatorMeta string `type:"bar",tc_resp_body_type:"true"`
}
type ReqBody struct {
TypeCreatorMeta string `type:"star",tc_req_body_type:"true"`
Handle string
}
return tc.ExtractType(
tc.TypeList{ReqBody{},RespBody{}},
func(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(v.People)
})
}
Функция tc.ExtractType выглядит следующим образом:
type TypeList = []interface{}
func ExtractType(s TypeList, h http.HandlerFunc) http.HandlerFunc {
m := make(map[string]string)
for _, v := range s {
t := reflect.TypeOf(v)
f, _ := t.FieldByName("TypeCreatorMeta")
fmt.Println("All tags?:",f.Tag);
v, ok := f.Tag.Lookup("type")
if !ok {
fmt.Println("no 'type' tag.");
continue;
}
for _, key := range []string{"tc_req_body_type", "tc_resp_body_type"} {
_, ok := f.Tag.Lookup(key)
fmt.Println(ok,"key:",key) // <<<< important
if ok {
m[key] = v
}
}
}
return func(w http.ResponseWriter, r *http.Request) {
fmt.Printf("Req: %s\n", r.URL.Path)
h.ServeHTTP(w, r)
}
}
он может найти тег "type", который указывает на "star", но по какой-то причине он не выбирает тег "tc_resp_body_type", который указывает на "true". Вот что я выхожу из системы:
All tags?: type:"star",tc_req_body_type:"true"
false key: tc_req_body_type
false key: tc_resp_body_type
Кто-нибудь знает, почему можно найти тег "тип", но не может быть найден "tc_req_body_type"?
2 ответа
reflect.StructTag
Get()
а также LookUp()
анализирует с использованием соглашения о тегах, определенного в refle.StructTag
По соглашению строки тегов представляют собой конкатенацию необязательно разделенных пробелами пар "значение". Каждый ключ является непустой строкой, состоящей из неуправляемых символов, кроме пробела (U+0020 ' '), кавычки (U+0022 '"') и двоеточия (U+003A ':'). Каждое значение заключено в кавычки используя символы "+" U + 0022 и буквенный синтаксис строки Go.
Так что просто измените свои теги так:
type RespBody struct {
TypeCreatorMeta string `type:"bar" tc_resp_body_type:"true"`
}
Тьфу я думаю, что это должно быть:
TypeCreatorMeta string `type:"bar" tc_resp_body_type:"true"` // no comma
использовать запятую, как это не правильно?
TypeCreatorMeta string `type:"bar",tc_resp_body_type:"true"`
кто-то может подтвердить?