Мне приходится иметь дело с огромными целыми числами в Голанге, которые приходят из REST API, определенного Swagger.Поскольку 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 не может обрабатывать big.Int так же, как другие встроенные типы, такие как
int64/uint64/float64
?