Я думал, что псевдоним типа будет более элегантным, чем встраивание структуры.Видите ли, если я создаю новый тип BigInt
, который встраивает big.Int
, мне нужно позаботиться о том, чтобы встроенный big.Int инициализировался всегда, и если я не переопределил big.Int, как Cmp, Add, Subвесь код, который зависит от этого нового типа, должен знать, что методы BigInt
фактически получают big.Int
для своих аргументов.Что глупо.
Итак, я попытался создать псевдоним типа.
type BigInt big.Int
// String casts BigInt into big.Int and uses its String method.
func (b *BigInt) String() string {
bc := big.Int(*b)
return bc.String()
}
Но настройка приемника указателя теперь очень сложная, потому что у меня нет доступа к внутренним элементам big.Int.Следующий код не работает вообще:
// UnmarshalJSON casts BigInt into big.Int and uses its UnmarshalJSON method.
func (b *BigInt) UnmarshalJSON(text []byte) error {
bc := new(big.Int)
err := bc.UnmarshalJSON(text)
if err != nil {
return err
}
b = b.Set(bc)
return nil
}
// Set is different from big.Int.Set() in that you must use the value it returns
func (b *BigInt) Set(i *big.Int) *BigInt {
iB := BigInt(*i)
b = &iB
return b
}
Что я могу сделать?