我讀過這個,但它與我的情況不同,我有以下代碼: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/[email protected]#StructTag
StructTag 是結構字段中的標記字符串。
按照慣例,標記字符串是可選的空格分隔鍵:“值”對的串聯。每個鍵都是一個非空字符串,由除空格(U+0020 ' ')、引號(U+0022 '"')和冒號(U+003A ':')之外的非控制字符組成。每個值都被引用使用 U+0022 '"' 字符和 Go 字符串文字語法。

慕娘9325324
TA貢獻1783條經驗 獲得超4個贊
key:"value"例如,結構標簽應該是 a field:"name"。
type User struct {
Name string `field:"name"`
Age int64 `field:"age"`
}
- 2 回答
- 0 關注
- 147 瀏覽
添加回答
舉報
0/150
提交
取消