Создан псевдоним типа для big.Int - но я не могу установить его с помощью приемника указателя? - PullRequest
0 голосов
/ 03 июня 2019

Я думал, что псевдоним типа будет более элегантным, чем встраивание структуры.Видите ли, если я создаю новый тип 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
}

Что я могу сделать?

Ответы [ 2 ]

2 голосов
/ 03 июня 2019

Это не псевдоним типа, это новый тип, и поэтому у него есть нет методов базового типа big.Int. Псевдоним типа будет type BigInt = big.Int, но тогда вы не сможете определить новые методы для него. Методы типа привязаны к его пакету: невозможно определить методы для импортируемого типа в дополнение к методам, которые он уже определил. Встраивание - самое близкое, что вы можете получить к этому. Скорее всего, вы захотите пересмотреть свой дизайн, скорее всего, создав функции, которые принимают big.Int вместо того, чтобы пытаться определить новые методы.

0 голосов
/ 03 июня 2019

Я забыл, что могу разыменовать и приемник указателя / левую сторону знака =. Это именно то, что я хотел ...

// Set makes a BigInt equal to a given big.Int.
func (b *BigInt) Set(i *big.Int) *BigInt {
    iB := BigInt(*i)
    *b = iB
    return b
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...