为了账号安全,请及时绑定邮箱和手机立即绑定

结构字段标记“名称”与 reflect.StructTag.Get 不兼容:结构标记对的错误语法

结构字段标记“名称”与 reflect.StructTag.Get 不兼容:结构标记对的错误语法

Go
holdtom 2022-12-26 16:51:21
我读过这个,但它与我的情况不同,我有以下代码:package mainimport (    "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 代码,它给了我以下问题:
查看完整描述

2 回答

?
临摹微笑

TA贡献1982条经验 获得超2个赞

请注意,这只是一个警告,告诉您您没有遵守约定。如您所知,该代码编译并运行并输出您想要的结果:https ://go.dev/play/p/gxcv8qPVZ6z 。

为避免警告,请禁用 linter,或者更好的是,通过key:"value"在结构标记中使用来遵循约定,然后使用以下Get方法提取值:https ://go.dev/play/p/u0VTGL48TjO 。


https://pkg.go.dev/reflect@go1.18.3#StructTag

StructTag 是结构字段中的标记字符串。

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


查看完整回答
反对 回复 2022-12-26
?
慕娘9325324

TA贡献1783条经验 获得超5个赞

key:"value"例如,结构标签应该是 a field:"name"。


type User struct {

    Name string `field:"name"`

    Age  int64  `field:"age"`

}


查看完整回答
反对 回复 2022-12-26
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号