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:
- Stała może wcale nie mieć adresu.
- 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ę).
, więc nie możemy znaleźć adresu stałej :) – Arvind