2016-02-02 3 views
9

Мы написали одну программу, по которой мы пытаемся найти адрес константы. Можно ли так это сделать?Найти адрес константы в go

package main 

func main() { 
     const k = 5 
     address := &k 
} 

Это ошибка, может ли кто-нибудь сказать, как мы можем найти адрес константы?

ответ

10

Вкратце: вы не можете.

сообщение об ошибке говорит:

не может взять адрес к

Существуют ограничения на операнд-адрес оператора &. Spec: Address operators:

Для операнда x типа T, операция адрес &x генерирует указатель типа *T к x. Операнд должен быть адресуемым, то есть переменная, указатель указателя или операция индексации фрагментов; или селектор поля адресного структурного операнда; или операцию индексирования массива адресного массива. В качестве исключения для требования адресности, x также может быть (возможно, в скобках) composite literal. Если оценка x вызовет run-time panic, то также будет выполнена оценка &x.

Константы не в списке адресуемых, и вещи, которые не перечислены в спецификации, как адресацией (цитированной выше) не может быть операндом адреса оператора & (вы не можете возьмите их адрес).

Нельзя принимать адрес постоянной. Это по двум причинам:

  1. У константы может не быть адреса вообще.
  2. И даже если постоянное значение сохраняется в памяти во время выполнения, это должно помочь во время выполнения поддерживать константы, которые: константа. Если вы можете принять адрес постоянного значения, вы можете назначить адрес (указатель) переменной, и вы можете изменить его (указанное значение, значение константы).

Если вам нужен указатель на значение, равное этой константе, назначьте его переменной, которая адресуется, чтобы вы могли принять ее адрес, например.

func main() { 
    const k = 5 
    v := k 
    address := &v // This is allowed 
} 

Но знайте, что числовые константы Go представляют значения произвольной точности и не переполняются. Когда вы назначаете значение константы переменной, она может оказаться невозможной (например, константа может быть больше максимального значения типа переменной, которую вы назначаете, что приводит к ошибке времени компиляции), или может не будет одинаковым (например, в случае констант с плавающей запятой, он может потерять точность).

+1

поэтому мы не можем найти адрес константы :) – Arvind

-2

Раздел constants не делает очень ясным: константы, в отличие от переменных, не присутствуют в скомпилированном коде или запущенной программе. Они являются untyped и будут находиться только в памяти, как только они будут назначены переменной.

В результате они кажутся , чтобы иметь бесконечную точность. Если вы посмотрите на this example, вы увидите, что я могу назначить константу переменной без ее литья, а переменная будет содержать как можно больше констант констант.


Как spec также указывает на то, целые числа, по крайней мере, 256 бит, плавает по меньшей мере, 256 бит мантиссы и 32 бит экспоненты, и компилятор выдаст ошибку, если ее внутренние конструкции, не может точно хранить постоянная.

+0

Не все константы нетипизированы. Существуют константы _typed_ и _untyped_. – icza

Смежные вопросы