【问题标题】:Struct field tag `name` not compatible with reflect.StructTag.Get: bad syntax for struct tag pair结构字段标记“名称”与 reflect.StructTag.Get 不兼容:结构标记对的语法错误
【发布时间】:2022-06-29 18:40:56
【问题描述】:

我读过this,但它与我的情况不同,我有以下代码:

package main

import (
    "bytes"
    "fmt"
    "reflect"
    "strconv"
    "strings"
)

type User struct {
    Name string `name`
    Age  int64  `age`
}

func main() {
    var u User = User{"bob", 10}

    res, err := JSONEncode(u)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(res))

}

func JSONEncode(v interface{}) ([]byte, error) {
    refObjVal := reflect.ValueOf(v)
    refObjTyp := reflect.TypeOf(v)
    buf := bytes.Buffer{}
    if refObjVal.Kind() != reflect.Struct {
        return buf.Bytes(), fmt.Errorf(
            "val of kind %s is not supported",
            refObjVal.Kind(),
        )
    }
    buf.WriteString("{")
    pairs := []string{}
    for i := 0; i < refObjVal.NumField(); i++ {
        structFieldRefObj := refObjVal.Field(i)
        structFieldRefObjTyp := refObjTyp.Field(i)

        switch structFieldRefObj.Kind() {
        case reflect.String:
            strVal := structFieldRefObj.Interface().(string)
            pairs = append(pairs, `"`+string(structFieldRefObjTyp.Tag)+`":"`+strVal+`"`)
        case reflect.Int64:
            intVal := structFieldRefObj.Interface().(int64)
            pairs = append(pairs, `"`+string(structFieldRefObjTyp.Tag)+`":`+strconv.FormatInt(intVal, 10))
        default:
            return buf.Bytes(), fmt.Errorf(
                "struct field with name %s and kind %s is not supprted",
                structFieldRefObjTyp.Name,
                structFieldRefObj.Kind(),
            )
        }
    }

    buf.WriteString(strings.Join(pairs, ","))
    buf.WriteString("}")

    return buf.Bytes(), nil
}

效果很好,输出如下:

{"name":"bob","age":10}

但作为 VS 代码,它给了我以下问题:

可能是什么问题?

【问题讨论】:

    标签: go


    【解决方案1】:

    结构标签假设为键/值,例如field:"name"

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      相关资源
      最近更新 更多