2015-12-31 8 views
7

Vor kurzem fand ich den Code unten:Was bedeutet diese Array-Init-Syntax? (Elemente mit Schlüsseln)

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, 
} 

Ich verstehe, dass diese [N]bool mit N initialisiert wird false (Nullen) standardmäßig. Wenn der Index gefolgt von einem Doppelpunkt angegeben wird, können Werte aus dem Index (einschließlich) definiert werden. Wo ist es beschrieben? Welche Typen können als Indexwert verwendet werden (im Beispiel gibt es eine char)?

+0

Go hat keinen 'char' Typ. Das sind 'rune' Literale und' rune' ist ein Typalias für 'int32'. Weitere Informationen finden Sie unter https://golang.org/ref/spec#Rune_literals. – voutasaurus

Antwort

7

Für ein Array- oder Schnittliteral müssen die Indexwerte Konstanten sein. Aus der Dokumentation auf "composite literals"

Bei Array und slice Literale gelten die folgenden Regeln:

  • Jedes Element hat einen zugehörigen ganzzahligen Index seine Position in dem Array Markierung.
  • Ein Element mit einem Schlüssel verwendet den Schlüssel als Index; Der Schlüssel muss ein konstanter Integer-Ausdruck sein.
  • Ein Element ohne Schlüssel verwendet den Index des vorherigen Elements plus eins. Wenn das erste Element keinen Schlüssel hat, ist sein Index gleich Null.

Die wörtlichen Zeichen im Beispiel sind nicht typisieren constants, die nur wörtliche als eine einzige Rune geschrieben werden passieren. Wenn Sie einem dieser Werte einen Wert zuweisen, der als Index verwendet werden soll, wird der Code nicht kompiliert.

+0

reflect.TypeOf ('a') gibt int32 sogar über eine Variable zurück. http://play.golang.org/p/udDxnPquaA – voutasaurus

+1

@voutasaurus: Der "Standardtyp" einer untypisierten Konstante, die als Runenliteral geschrieben wird, ist 'rune', was einfach ein Alias ​​für' int32' ist. Da reflect es in einen gültigen Typ konvertieren muss, um zu bestimmen, was es ist, drucken beide Versionen 'int32'. Ich habe einen Link zur Spezifikation "Konstanten" hinzugefügt, der die Standardtypen erläutert. – JimB