Правильно ли я использую переименованные типы в Golang? - PullRequest
0 голосов
/ 01 марта 2019

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

1 Ответ

0 голосов
/ 01 марта 2019

Это действительно, как я должен делать вещи?

Это способ сделать это, но это не то, что я бы назвал "тип переименован;это структура, содержащая одно поле.Вы также можете сделать (например, time.Duration):

type BigInt *big.Int

и применить к нему методы.Это позволит вам легко конвертировать между *big.Int и вашим типом.

Почему golang не может обрабатывать big.Int так же, как другие встроенные типы, такие как int64 / uint64 / float64?

Поскольку в отличие от этих типов, big.Int не является встроенным типом;Вы можете сказать, потому что это big.Int, то есть он определен в пакете, а не на языке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...