Konstanten in der Go-Sprache
Eine Konstante ist ein Bezeichner für einen einfachen Wert, eine Größe, die während der Programmlaufzeit nicht geändert wird. Die Datentypen in Konstanten können nur boolesche, numerische (Ganzzahl, Gleitkommazahl und komplexe Zahl) und String-Typen sein.
Wortdefinitionen: constJaconstantAbkürzung für (Konstante), die einen unveränderlichen Wert in einem Programm darstellt.
Grundlegende Syntax und Parameter
Das Definitionsformat für Konstanten:
const identifier [type] = value
Syntaxbeschreibung
- BezeichnerKonstantenname, der den Namensregeln für Go-Bezeichner folgt (Buchstaben, Ziffern, Unterstriche und darf nicht mit einer Ziffer beginnen).
- type(Optional): Typname; wenn weggelassen, wird er automatisch vom Compiler abgeleitet.
- Wert: der Wert der Konstante.
Definitionsmethoden
- Explizite Typdefinition:
const b string = "abc" - Implizite Typdefinition:
const b = "abc" - Sammeldefinition:
const c_name1, c_name2 = value1, value2
Beispiel
Beispiel 1: Grundlegende Konstantendefinition
Beispiel
import "fmt"
func main() {
const LENGTH int = 10
const WIDTH int = 5
var area int
const a, b, c = 1, false, "str" // Mehrfachzuweisung
area = LENGTH * WIDTH
fmt.Printf("Area is: %d", area)
println()
println(a, b, c)
}
Erwartete Ausgabe:
面积为 : 50 1 false str
Codeanalyse:
const LENGTH int = 10Definiert eine ganzzahlige Konstante LENGTH mit dem Wert 10.const WIDTH int = 5Definiert eine ganzzahlige Konstante WIDTH mit dem Wert 5.const a, b, c = 1, false, "str"Verwendet Mehrfachzuweisung, um mehrere Konstanten unterschiedlichen Typs gleichzeitig zu definieren.area = LENGTH * WIDTHBerechnet die Fläche und weist sie der Variablen area zu.
Konstantengruppen und Enums
Go hat kein enum-Schlüsselwort; es verwendet normalerweise Konstantengruppen, um enum-ähnliches Verhalten zu erreichen:
Beispiel
import "fmt"
// Geschlechts-Enum definieren
const (
Unknown = 0
Female = 1
Male = 2
)
func main() {
fmt.Printf("Unknown=%d, Female=%d, Male=%d\n", Unknown, Female, Male)
}
Erwartete Ausgabe:
未知=0, 女性=1, 男性=2
Codeanalyse:
- Mit einer Konstantengruppe können Sie eine Reihe zusammengehöriger konstanter Werte definieren.
- Die Zahlen 0, 1 und 2 stehen jeweils für unbekanntes Geschlecht, weiblich und männlich.
Anwendung von eingebauten Funktionen in Konstanten
In konstanten Ausdrücken können Sielen()、cap()、unsafe.Sizeof()und andere eingebaute Funktionen, um den Wert des Ausdrucks zu berechnen.
Hinweis:In konstanten Ausdrücken müssen Funktionen eingebaute Funktionen sein.
Beispiel
import (
"fmt"
"unsafe"
)
const (
a = "abc"
b = len(a)
c = unsafe.Sizeof(a)
)
func main() {
fmt.Printf("a=%s, b=%d, c=%d\n", a, b, c)
}
Erwartete Ausgabe:
a=abc, b=3, c=16
Codeanalyse:
a = "abc": String-Konstante.b = len(a): Verwende len(), um die Länge der Zeichenkette zu erhalten; das Ergebnis ist 3.c = unsafe.Sizeof(a): Verwende unsafe.Sizeof(), um den Speicherverbrauch der Variable zu ermitteln; das Ergebnis ist 16 Bytes (die String-Struktur belegt 16 Bytes auf einem 64-Bit-System).
iota-Konstantenzähler
iotaIst eine spezielle Konstante in Go, auch bekannt als Konstantenzähler. Sie kann innerhalb eines const-Deklarationsblocks automatisch eine ansteigende Folge von Werten erzeugen.
Wichtige Features:
iotaInconstDas Schlüsselwort wird beim Auftreten auf 0 zurückgesetzt.- In const erhöht jede neue Zeile einer Konstantendeklaration den iota-Zähler um 1.
- Es kann als Zeilenindex innerhalb des const-Anweisungsblocks verstanden werden (beginnend bei 0).
Beispiel 1: Grundlegende iota-Verwendung
Beispiel
import "fmt"
// iota beginnt bei 0, erhöht sich pro Zeile um 1
const (
a = iota // 0
b // 1 (weggelassener Wert, standardmäßig der iota-Wert der vorherigen Zeile)
c // 2
)
func main() {
fmt.Printf("a=%d, b=%d, c=%d\n", a, b, c)
}
Erwartete Ausgabe:
a=0, b=1, c=2
Codeanalyse:
- Wenn der Konstantenwert weggelassen wird, wird standardmäßig der iota-Wert aus der vorherigen Zeile verwendet.
- Daher gilt b=1, c=2.
Beispiel 2: Detaillierte Verwendung von iota
Beispiel
import "fmt"
func main() {
const (
a = iota // 0
b // 1
c // 2
d = "ha" // Unabhängiger Wert, iota += 1
e // "ha",iota += 1
f = 100 // Unabhängiger Wert, iota += 1
g // 100,iota += 1
h = iota // 7, unter Verwendung des iota-Werts fortfahren
i // 8
)
fmt.Printf("a=%d, b=%d, c=%d, d=%s, e=%s, f=%d, g=%d, h=%d, i=%d\n", a, b, c, d, e, f, g, h, i)
}
Erwartete Ausgabe:
a=0, b=1, c=2, d=ha, e=ha, f=100, g=100, h=7, i=8
Codeanalyse:
- Wenn ein Wert explizit zugewiesen wird, wird dieser Wert verwendet, aber iota wird trotzdem erhöht.
- Wenn die Zuweisung weggelassen wird, wird der Wert aus der vorherigen Zeile verwendet.
- In
h = iotaDann wird mit dem aktuellen Wert von iota (7) fortgefahren.
Beispiel 3: iota und Bit-Shift-Operationen
Beispiel
import "fmt"
const (
i = 1 << iota // 1 << 0 = 1
j = 3 << iota // 3 << 1 = 6
k // 3 << 2 = 12
l // 3 << 3 = 24
)
func main() {
fmt.Printf("i=%d, j=%d, k=%d, l=%d\n", i, j, k, l)
}
Erwartete Ausgabe:
i=1, j=6, k=12, l=24
Codeanalyse:
<<ist der Linksverschiebungsoperator,x << nÄquivalent zux * 2^n。i = 1 << 0 = 1: 1 um 0 Bits nach links verschoben, das Ergebnis ist 1.j = 3 << 1 = 6: 3 um 1 Bit nach links verschoben, aus der Binärzahl 11 wird 110, was 6 ist.k = 3 << 2 = 12: 3 um 2 Bits nach links verschoben, aus der Binärzahl 11 wird 1100, was 12 ist.l = 3 << 3 = 24: 3 um 3 Bits nach links verschoben, aus der Binärzahl 11 wird 11000, was 24 ist.
Zusätzliche Hinweise
1 << n = 1 * 2^n3 << n = 3 * 2^n