由于某些原因无法读取StructTag

时间:2018-12-02 04:05:07

标签: go go-reflect go-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)
    }
}

它能够找到指向“ star”的“ type”标记,但是由于某种原因,它没有选择指向“ true”的“ tc_resp_body_type”标记。这是我注销的内容:

All tags?: type:"star",tc_req_body_type:"true"
false key: tc_req_body_type
false key: tc_resp_body_type

有人知道为什么可以找到“ type”标签,但是找不到“ tc_req_body_type”吗?

2 个答案:

答案 0 :(得分:1)

reflect.StructTag Get()LookUp()使用reflect.StructTag

中定义的标记约定进行解析
  

按照惯例,标记字符串是由可选的以空格分隔的键:“值”对的串联。每个键都是一个非空字符串,由空格(U + 0020''),引号(U + 0022'“')和冒号(U + 003A':')以外的非控制字符组成。每个值都用引号引起来。使用U + 0022'“'字符和Go字符串文字语法。

因此只需更改标签,如下所示:

type RespBody struct {
    TypeCreatorMeta string `type:"bar" tc_resp_body_type:"true"`
}

答案 1 :(得分:0)

嗯,我认为应该是:

    TypeCreatorMeta string `type:"bar" tc_resp_body_type:"true"` // no comma

使用这样的逗号是不正确的?

    TypeCreatorMeta string `type:"bar",tc_resp_body_type:"true"`

有人可以确认吗?