Skip to content

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:

go
const name string = "Jack" // Literal

const msg = "hello world" // Literal

const num = 1 // Literal

const numExpression = (1+2+3) / 2 % 100 + num // Konstanter Ausdruck

Wenn nur deklariert wird, ohne einen Wert anzugeben, kann die Kompilierung nicht bestanden werden:

go
const name string

Compiler-Fehlermeldung:

missing init expr for name

Die Massendeklaration von Konstanten kann mit () geklammert werden, um die Lesbarkeit zu verbessern. Es können mehrere () existieren, um Gruppierungseffekte zu erzielen.

go
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:

go
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.

go
const iota = 0

Hier einige Anwendungsbeispiele:

go
const (
   Num = iota // 0
   Num1 // 1
   Num2 // 2
   Num3 // 3
   Num4 // 4
)

Kann auch so geschrieben werden:

go
const (
   Num = iota*2 // 0
   Num1 // 2
   Num2 // 4
   Num3 // 6
   Num4 // 8
)

Oder auch:

go
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:

go
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:

go
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.

go
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 Season ein benutzerdefinierter Typ ist, können andere Zahlen durch erzwungene Typkonvertierung in diesen Typ konvertiert werden:

    go
    Season(6)
  • Umständlich, die String-Darstellung muss selbst implementiert werden

  • Schwache Ausdrucksfähigkeit, da const nur 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.

Golang by www.golangdev.cn edit