2016-02-02 14 views
9

Abbiamo scritto un programma con il quale cerchiamo di trovare un indirizzo di una costante. È possibile farlo in quel modo?Trova indirizzo di costante in go

package main 

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

dà un errore, qualcuno può dire come siamo in grado di trovare l'indirizzo di una costante?

risposta

10

In breve: non è possibile.

Il messaggio di errore dice:

non può prendere l'indirizzo del k

Non ci sono limiti alla operando dell'operatore indirizzo &. Spec: Address operators:

Per un operando x di tipo T, l'operazione indirizzo &x genera un puntatore di tipo *T a x. L'operando deve essere indirizzabile, ovvero una variabile, puntatore indiretto o operazione di indicizzazione delle sezioni; o un selettore di campo di un operando struct indirizzabile; o un'operazione di indicizzazione dell'array di un array indirizzabile. In deroga al requisito di indirizzabilità, x può anche essere un (eventualmente tra parentesi) composite literal. Se la valutazione di x causerebbe un valore run-time panic, verrà eseguita anche la valutazione di &x.

costanti sono non elencati come indirizzabili, e le cose che non sono elencati nelle specifiche, come indirizzabile (citato sopra) non può essere l'operando dell'operatore indirizzo & (non è possibile prendere l'indirizzo di loro).

Non è consentito prendere l'indirizzo di una costante. Questo è per 2 motivi:

  1. Una costante potrebbe non avere un indirizzo.
  2. E anche se un valore costante è memorizzato in memoria in fase di esecuzione, questo è per aiutare il runtime a mantenere costanti che: costante. Se si potesse prendere l'indirizzo di un valore costante, si potrebbe assegnare l'indirizzo (puntatore) a una variabile e si potrebbe cambiarlo (il valore puntato, il valore della costante).

Se è necessario un puntatore a un valore uguale a quella costante, assegnarlo a una variabile di cui è indirizzabile in modo da poterne prendere l'indirizzo, ad es.

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

Ma sanno che in Go costanti numeriche rappresentano i valori di precisione arbitraria e non fanno troppo pieno. Quando assegni il valore di una costante a una variabile, potrebbe non essere possibile (ad esempio la costante potrebbe essere maggiore del valore massimo del tipo della variabile a cui la stai assegnando - risultante in errore in fase di compilazione), oppure potrebbe non essere lo stesso (ad es. in caso di costanti floating point, potrebbe perdere precisione).

+1

quindi non è possibile trovare l'indirizzo di costante :) – Arvind

-2

La sezione constants non è molto chiara: le costanti sono, a differenza delle variabili, non presenti nel codice compilato o nel programma in esecuzione. Sono non tipizzati e saranno in memoria solo dopo essere stati assegnati a una variabile.

Come risultato, sembrano avere precisione infinita. Se guardi allo this example, puoi vedere che posso assegnare la costante a una variabile senza lanciarla, e la variabile manterrà la maggior precisione possibile delle costanti.


Come spec segnala inoltre, interi hanno almeno 256 bit, galleggianti almeno 256 bit mantissa e 32 bit esponente, e il compilatore genera un errore se i suoi costrutti interni non possono memorizzare con precisione un costante.

+0

Non tutte le costanti non sono tipizzate. Ci sono costanti _typed_ e _untyped_. – icza