Go-Konstanten
Der Wert einer Konstanten kann zur Laufzeit nicht geändert werden. Sobald ein Wert zugewiesen wurde, kann er nicht mehr geändert werden. Der Wert kann nur aus folgenden Quellen stammen:
- Literale
- Andere Konstanten-Identifizierer
- Konstante Ausdrücke
- Typkonvertierungen, deren Ergebnis eine Konstante ist
- iota
Konstanten können nur grundlegende Datentypen sein, nicht jedoch:
- Andere Typen als grundlegende Typen, wie Strukturen, Schnittstellen, Slices, Arrays usw.
- Rückgabewerte von Funktionen
Der Wert einer Konstanten kann nicht geändert werden, andernfalls kann die Kompilierung nicht bestanden werden.
Initialisierung
Zur Deklaration von Konstanten wird das Schlüsselwort const verwendet. Konstanten müssen bei der Deklaration initialisiert werden, und der Typ der Konstanten kann weggelassen werden, zum Beispiel:
const name string = "Jack" // Literal
const msg = "hello world" // Literal
const num = 1 // Literal
const numExpression = (1+2+3) / 2 % 100 + num // Konstanter AusdruckWenn nur deklariert wird, ohne einen Wert anzugeben, kann die Kompilierung nicht bestanden werden:
const name stringCompiler-Fehlermeldung:
missing init expr for nameDie Massendeklaration von Konstanten kann mit () geklammert werden, um die Lesbarkeit zu verbessern. Es können mehrere () existieren, um Gruppierungseffekte zu erzielen.
const (
Count = 1
Name = "Jack"
)
const (
Size = 16
Len = 25
)In derselben Konstantengruppe müssen Konstanten, die auf bereits zugewiesene Konstanten folgen, nicht zugewiesen werden. Ihr Wert ist standardmäßig der Wert des vorherigen, zum Beispiel:
const (
A = 1
B // 1
C // 1
D // 1
E // 1
)iota
iota ist ein integrierter Konstanten-Identifizierer, der typischerweise verwendet wird, um eine typlose Ganzzahl-Ordnungszahl in einer Konstantendeklaration darzustellen. Er wird im Allgemeinen in Klammern verwendet.
const iota = 0Hier einige Anwendungsbeispiele:
const (
Num = iota // 0
Num1 // 1
Num2 // 2
Num3 // 3
Num4 // 4
)Kann auch so geschrieben werden:
const (
Num = iota*2 // 0
Num1 // 2
Num2 // 4
Num3 // 6
Num4 // 8
)Oder auch:
const (
Num = iota << 2*3 + 1 // 1
Num1 // 13
Num2 // 25
Num3 = iota // 3
Num4 // 4
)Anhand der obigen Beispiele lässt sich erkennen, dass iota inkrementell ist. Der erste Konstante verwendet den Ausdruck des iota-Werts. Basierend auf der Änderung des Ordnungswerts wird automatisch den nachfolgenden Konstanten zugewiesen, bis er mit einem neuen const zurückgesetzt wird. Diese Ordnungsnummer ist tatsächlich die relative Code-Zeilennummer, relativ zur Startzeile der aktuellen Gruppe. Siehe das folgende Beispiel:
const (
Num = iota<<2*3 + 1 // 1 Erste Zeile
Num2 = iota<<2*3 + 1 // 13 Zweite Zeile
_ // 25 Dritte Zeile
Num3 //37 Vierte Zeile
Num4 = iota // 4 Fünfte Zeile
_ // 5 Sechste Zeile
Num5 // 6 Siebte Zeile
)Im Beispiel wird der anonyme Identifizierer _ verwendet, um eine Zeile einzunehmen. Es ist ersichtlich, dass der Wert von iota im Wesentlichen die Differenz zwischen der Zeile, in der sich iota befindet, und der ersten Zeile der aktuellen const-Gruppe ist. Unterschiedliche const-Gruppen beeinflussen sich gegenseitig nicht.
Enumeration
Die Go-Sprache hat keinen separaten Datentyp für Enumerationen entworfen, im Gegensatz zu anderen Sprachen, die normalerweise ein enum haben. Im Allgemeinen werden in Go Enumerationen durch benutzerdefinierte Typen + const + iota implementiert. Hier ein einfaches Beispiel:
type Season uint8
const (
Spring Season = iota
Summer
Autumn
Winter
)Diese Enumerationen sind tatsächlich Zahlen. Go unterstützt nicht die direkte Konvertierung in Strings, aber wir können dem benutzerdefinierten Typ eine Methode hinzufügen, um seine String-Darstellung zurückzugeben, indem wir die Stringer-Schnittstelle implementieren.
func (s Season) String() string {
switch s {
case Spring:
return "spring"
case Summer:
return "summer"
case Autumn:
return "autumn"
case Winter:
return "winter"
}
return ""
}Auf diese Weise ist eine einfache Enumeration implementiert. Sie können auch das offizielle Tool Stringer verwenden, um Enumerationen automatisch zu generieren.
Es gibt jedoch folgende Nachteile:
Typunsicherheit, da
Seasonein benutzerdefinierter Typ ist, können andere Zahlen durch erzwungene Typkonvertierung in diesen Typ konvertiert werden:goSeason(6)Umständlich, die String-Darstellung muss selbst implementiert werden
Schwache Ausdrucksfähigkeit, da
constnur grundlegende Datentypen unterstützt, können diese Enumerationswerte nur durch Strings und Zahlen dargestellt werden
Warum Enumerationen nicht auf Sprachebene unterstützt werden, ist etwas, das der Autor absolut nicht verstehen kann. Ich glaube, dies ist definitiv mehr Vor- als Nachteile.
