将有符号值读入无符号类型
Reading a signed value into an unsigned type
在 Go 中,可以采用带符号的值并强制语言通过执行以下操作将其解释为无符号:
var x int32
var y uint32
x = -1
y = uint32(x)
这按预期工作,y
取最大的 unsigned int32 值。但是,如果我有一个像这样的 JSON 字符串:
注意:值-20
序列化为字符串还是数字似乎并不重要
jsonStr := `{"RandomNumber: -20}
type DummyJson struct {
RandomNumber uint32
}
rd := &DummyJson{}
err := json.Unmarshal([]byte(jsonStr), &rd)
fmt.Println(err)
在这里,它抱怨值 -20 无法解组到 RandomNumber 字段中。我怎样才能说服 Go 将有符号值转换为无符号类型?
P.S:这样做的动机又长又曲折。所以请假设这个问题背后有一个合理的理由。
使用 UnmarshalJSON
方法创建自定义类型。
type DummyJson struct {
RandomNumber CustomIntType
}
type CustomIntType uint32
func (ct *CustomIntType) UnmarshalJSON(b []byte) error {
var x int32
var y uint32
s := string(b)
if i, err := strconv.Atoi(s); err == nil {
x = int32(i)
y = uint32(x)
*ct = CustomIntType(y)
} else {
return err
}
return nil
}
jsonStr := `{"RandomNumber": -20}`
var rd DummyJson
err := json.Unmarshal([]byte(jsonStr), &rd)
fmt.Println(rd.RandomNumber, err)
我确定可以优化转换,但不确定如何优化。
在 Go 中,可以采用带符号的值并强制语言通过执行以下操作将其解释为无符号:
var x int32
var y uint32
x = -1
y = uint32(x)
这按预期工作,y
取最大的 unsigned int32 值。但是,如果我有一个像这样的 JSON 字符串:
注意:值-20
序列化为字符串还是数字似乎并不重要
jsonStr := `{"RandomNumber: -20}
type DummyJson struct {
RandomNumber uint32
}
rd := &DummyJson{}
err := json.Unmarshal([]byte(jsonStr), &rd)
fmt.Println(err)
在这里,它抱怨值 -20 无法解组到 RandomNumber 字段中。我怎样才能说服 Go 将有符号值转换为无符号类型?
P.S:这样做的动机又长又曲折。所以请假设这个问题背后有一个合理的理由。
使用 UnmarshalJSON
方法创建自定义类型。
type DummyJson struct {
RandomNumber CustomIntType
}
type CustomIntType uint32
func (ct *CustomIntType) UnmarshalJSON(b []byte) error {
var x int32
var y uint32
s := string(b)
if i, err := strconv.Atoi(s); err == nil {
x = int32(i)
y = uint32(x)
*ct = CustomIntType(y)
} else {
return err
}
return nil
}
jsonStr := `{"RandomNumber": -20}`
var rd DummyJson
err := json.Unmarshal([]byte(jsonStr), &rd)
fmt.Println(rd.RandomNumber, err)
我确定可以优化转换,但不确定如何优化。