2016-02-02 15 views
9

Napisaliśmy jeden program, w którym staramy się znaleźć adres stałej. Czy można to zrobić tak?Znajdź adres stałej w go

package main 

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

Daje błąd, czy ktoś może powiedzieć, jak znaleźć adres stałej?

Odpowiedz

10

W skrócie: nie można.

Komunikat o błędzie mówi:

nie może mieć adresu k

Istnieją ograniczenia co do argumentu operatora adresowej &. Spec: Address operators:

Dla argumentu x typu T operacja adres &x generuje wskaźnik typu *T do x. Operand musi być adresowalny adresowalny, to znaczy zmienna, wskaźnikowy lub indeksujący; lub selektor pól adresowalnego operandu strukturalnego; lub operacja indeksowania tablic adresowalnej tablicy. Jako wyjątek od wymogu adresowalności, x może być również (ewentualnie nawiązywany w nawias) composite literal. Jeśli ocena x spowodowałaby run-time panic, to również ocena &x.

Stałe są nie liście adresowalnych, i rzeczy, które nie są wymienione w specyfikacji jako adresowalnych (cytowane powyżej) nie może być operand operatora adresowej & (nie można weź adres ich).

Nie wolno przyjmować adresu stałej. Jest tak z 2 powodów:

  1. Stała może wcale nie mieć adresu.
  2. Nawet jeśli w środowisku uruchomionym przechowywana jest stała wartość w pamięci, ma to pomóc środowisku wykonawczemu w utrzymaniu stałych: stała. Jeśli możesz wziąć adres stałej wartości, możesz przypisać adres (wskaźnik) do zmiennej i możesz to zmienić (wskazana wartość, wartość stałej).

Jeśli potrzebujesz wskaźnika do wartości równej tej stałej, przypisz ją do zmiennej, która jest adresowalna, abyś mógł wziąć jej adres, np.

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

Ale wiem, że w Go stałe numeryczne reprezentują wartości arbitralnej precyzji i nie przepełniają. Kiedy przypisujesz wartość stałej do zmiennej, może nie być to możliwe (np. Stała może być większa niż maksymalna wartość typu zmiennej, do której ją przypisujesz - powodując błąd podczas kompilacji), lub może nie może być taki sam (np. w przypadku stałych zmiennoprzecinkowych może stracić precyzję).

+1

, więc nie możemy znaleźć adresu stałej :) – Arvind

-2

Sekcja constants nie daje jasności: Stałe są, w przeciwieństwie do zmiennych, nieobecne w skompilowanym kodzie lub uruchomionym programie. Są one untyped i będą przechowywane w pamięci tylko wtedy, gdy zostaną przypisane do zmiennej.

W rezultacie wydają się być mieć nieskończoną precyzję. Jeśli spojrzysz na this example, zobaczysz, że mogę przypisać stałą do zmiennej bez rzucania jej, a zmienna będzie utrzymywać tak dużą dokładność stałych, jak to tylko możliwe.


Jak spec wskazuje również, całkowite mieć co najmniej 256 bitów, pływaki co najmniej 256 bitów mantysy i 32 bitów wykładnik, a kompilator wygeneruje błąd, jeśli jej wewnętrzne konstrukty nie można dokładnie zapisać stały.

+0

Nie wszystkie stałe są bez typu. Istnieją stałe _typed_ i _untyped_. – icza

Powiązane problemy