Разница между big.Int и * big.Int, и как вы передаете big.Int по значению - PullRequest
0 голосов
/ 05 февраля 2019

Я могу использовать такие методы, как Text () для big.Int, и он работает нормально, но если я возвращаю big.Int, тогда использование «myfunc (). Text ()» выдает ошибку, тогда как если я возвращаю *Я не получаю ошибки.Почему я могу использовать Text () для big.Int, * big.Int и для функции, которая возвращает * big.Int, но не для функции, возвращаемое значение которой big.Int?

https://play.golang.org/p/ovgeQDHFstP

Исходя из этого и другого поведения (например, как он печатает), это выглядит как * большой. Это тип, который предназначен для использования, это правильно?

Кроме того, если ясделать и использовать переменную типа big.Int или * big.Int, она передается по ссылке.Все в порядке.Но если я хотел передать один по значению, как это лучше всего сделать?

Должен ли я создать новый big.Int и установить его в исходное значение с помощью Set () и передать его?Или я должен передать оригинал big.Int и скопировать его значение в новый big.Int, используя Set () внутри функции?Или есть какой-то другой, лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Метод Text() определен для типа получателя *big.Int, поэтому очевидно, что вы можете вызывать его для переменных этого типа и для возвращаемых значений функций, возвращающих *big.Int.Вы также можете вызывать его для переменных типа big.Int, потому что Go автоматически берет адрес переменной, когда вы пытаетесь вызвать ее методы указателя, просто чтобы избавить вас от необходимости набирать дополнительный амперсанд.

Однако вы не можете вызвать его при возвращении значения функции, возвращающей big.Int, потому что это значение не адресуемо.Вот что спецификация говорит об адресуемости:

Для операнда x типа T операция адреса & x генерирует указатель типа * T на x.Операнд должен быть адресуемым, т. Е. Либо переменной, либо косвенным указателем, либо операцией индексации слайса;или селектор поля адресуемого структурного операнда;или операция индексации массива адресуемого массива.В качестве исключения из требования адресуемости, x также может быть (возможно заключенным в скобки) составным литералом.

Ваше возвращаемое значение не является ни одной из этих вещей, поэтому вы не можете использовать метод указателя больше, чемВы можете написать foo := &myFunc().Чтобы обойти это, вы можете сохранить возвращаемое значение в переменной, чтобы сделать его адресуемым.Но, скорее всего, ваша функция должна возвращать указатель в первую очередь.

Также обратите внимание, что в Go нет ссылок.Все передается по значению, а указатели являются значениями, как и любые другие.

0 голосов
/ 05 февраля 2019

https://golang.org/pkg/math/big/ метод Text() имеет получатель указателя, что означает, что вы можете вызвать a.Text(), только если a * *big.Int.

*big.Int - указатель на big.Int, см. https://play.golang.org/p/dD70b0tPeGp для фиксированной версии вашего кода

...