【发布时间】:2019-03-01 23:42:22
【问题描述】:
我必须在 Golang 中处理来自 Swagger 定义的 REST API 的巨大整数。由于 Swagger 需要 Validate(strfmt.Registry),因此我这样定义我的自定义类型:
// BigInt is a big.Int, but includes a Validate() method for swagger
// Once created, it can be used just like a big.Int.
type BigInt struct {
*big.Int
}
由于需要与 JSON 相互转换,我定义了一些 JSON Marshaling 接口:
// UnmarshalJSON implements encoding/json/RawMessage.UnmarshalJSON
func (b *BigInt) UnmarshalJSON(data []byte) error {
err := json.Unmarshal(data, &b.Int)
if err != nil {
return err
}
return nil
}
// MarshalJSON calls json.Marshal() on the BigInt.Int field.
func (b *BigInt) MarshalJSON() ([]byte, error) {
if b == nil {
return []byte("null"), nil
}
return json.Marshal(b.Int)
}
现在我意识到我的自定义类型实际上并不完全像big.Int。为了比较两个 BigInts:
example := BigInt{Int: &big.Int{}}
other := BigInt{Int: &big.Int{}}
example.Cmp(other.Int)
我做不到
example.Cmp(other)
这更清洁。而且创建 BigInt 也是一种糟糕的体验,我必须将其包装在这样的函数中:
// NewBigInt creates a BigInt with its Int struct field
func NewBigInt() (i *BigInt) {
return &BigInt{Int: &big.Int{}}
}
- 这真的是我应该做的事情吗?
- 为什么 golang 不能像
int64/uint64/float64这样的其他内置类型一样对待 big.Int?
【问题讨论】:
-
需要是指针吗?如果您按原样嵌入 big.Int,那么您可以使用
&BigInt{}而不是&BigInt{Int: &big.Int{}}。 -
而且
big.Int已经实现了json的Marshaler和Unmarshaler接口,所以你不需要这样做。除了为big.Int的每个方法或至少您的应用正在使用的方法声明委托方法之外,您对example.Cmp(other.Int)无能为力。
标签: go