猿问

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

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

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 代码,它给了我以下问题:

holdtom
浏览 162回答 2
2回答

临摹微笑

请注意,这只是一个警告,告诉您您没有遵守约定。如您所知,该代码编译并运行并输出您想要的结果:https&nbsp;://go.dev/play/p/gxcv8qPVZ6z 。为避免警告,请禁用 linter,或者更好的是,通过key:"value"在结构标记中使用来遵循约定,然后使用以下Get方法提取值:https&nbsp;://go.dev/play/p/u0VTGL48TjO 。https://pkg.go.dev/reflect@go1.18.3#StructTagStructTag 是结构字段中的标记字符串。按照惯例,标记字符串是可选的空格分隔键:“值”对的串联。每个键都是一个非空字符串,由除空格(U+0020 ' ')、引号(U+0022 '"')和冒号(U+003A ':')之外的非控制字符组成。每个值都被引用使用 U+0022 '"' 字符和 Go 字符串文字语法。

慕娘9325324

key:"value"例如,结构标签应该是 a field:"name"。type User struct {&nbsp; &nbsp; Name string `field:"name"`&nbsp; &nbsp; Age&nbsp; int64&nbsp; `field:"age"`}
随时随地看视频慕课网APP

相关分类

Go
我要回答