我读过这个,但它与我的情况不同,我有以下代码: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 字符串文字语法。
慕娘9325324
TA贡献1783条经验 获得超5个赞
key:"value"例如,结构标签应该是 a field:"name"。
type User struct {
Name string `field:"name"`
Age int64 `field:"age"`
}
- 2 回答
- 0 关注
- 161 浏览
添加回答
举报
0/150
提交
取消
