2015-12-31 5 views
7

Recentemente ho trovato il codice qui sottoChe cosa significa questa sintassi di init dell'array? (elementi con chiavi)

var noEscape = [256]bool{ 
    'A': true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, 
    'a': true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, 
    '0': true, true, true, true, true, true, true, true, true, true, 
    '-': true, 
    '.': true, 
    '_': true, 
    '~': true, 
} 

Sono consapevole che questo [N]bool viene inizializzato con N false (zeri) per impostazione predefinita. E se l'indice seguito da due punti è specificato, i valori possono essere definiti dall'indice (incluso). Dove è descritto? Quali tipi possono essere utilizzati come valore di indice (nell'esempio è presente un numero char)?

+0

Go non ha un tipo 'char'. Quelli sono letterali 'rune' e' rune' è un alias di tipo per 'int32'. Vedi https://golang.org/ref/spec#Rune_literals per maggiori dettagli. – voutasaurus

risposta

7

Per un array o una porzione letterale, i valori dell'indice devono essere costanti. Dai documenti sul "composite literals"

Array e slice letterali applicano le seguenti regole:

  • Ciascun elemento ha un indice intero associato marcatura sua posizione nella matrice.
  • Un elemento con una chiave utilizza il tasto come indice; la chiave deve essere un'espressione intera costante.
  • Un elemento senza chiave utilizza l'indice dell'elemento precedente più uno. Se il primo elemento non ha una chiave, il suo indice è zero.

I caratteri letterali nell'esempio sono tipizzato constants, che ha appena capita di essere scritta come una singola runa letterale. Se dovessi assegnare uno di questi valori a una variabile da utilizzare come indice, il codice non verrebbe compilato.

+0

reflect.TypeOf ('a') restituisce int32 anche tramite una variabile. http://play.golang.org/p/udDxnPquaA – voutasaurus

+1

@voutasaurus: Il "tipo predefinito" di una costante non tipizzata scritta come runa letterale è 'rune', che è semplicemente un alias per' int32'. Poiché reflect deve convertirlo in un tipo valido per determinare di cosa si tratta, entrambe le versioni stampano 'int32'. Ho aggiunto un collegamento alla specifica "Costanti" che spiega i tipi di default. – JimB

Problemi correlati