Das sieht aus wie eine Struktur mit einem eingebetteten Feld sync.Mutex, aber ich kann meinen Kopf nicht um die zweite Klammerreihe herumführen. Es kompiliert und führt aus, aber was ist los? Warum ist das Etikett auf dem make-Befehl wichtig (tut es) und das Komma? Danke ...
Das Beispiel, das Sie haben, entspricht:
%Vor% Außer in Ihrem Beispiel deklarieren Sie keinen Typ von Cache
und haben stattdessen eine anonyme Struktur. In meinem Beispiel entspricht der Typ für den Typ Cache
dem gesamten
Denken Sie also an das zweite Paar Klammern als
%Vor%Teil.
make
ist eine eingebaute Funktion, die ähnlich funktioniert wie C's calloc()
, die beide eine Datenstruktur initialisieren, die mit 0'd Werten gefüllt ist. In Gos Fall müssen bestimmte Datenstrukturen auf diese Weise initialisiert werden, andere (für die Die meisten Teilstrukturen werden automatisch mit 0'd Werten initialisiert. Das Feld dort wird benötigt, damit der Compiler jetzt cache.mapping
eine leere map[string]string
ist.
Das Komma ist ein Teil von Go's Formatierung, du kannst Cache{mapping: make(map[string]string)}
all in einer Zeile machen, aber in dem Moment, in dem die Zuweisung des Feldes in einer anderen Zeile als die öffnenden und schließenden Klammern ist, benötigt es ein Komma.
Dies wird als "struct literal" oder "anonyme Struktur" bezeichnet. Es ist in der Tat so, dass Sie in Go immer Strukturen erstellen. Es ist vielleicht nicht sofort offensichtlich, da Sie möglicherweise neue Typen für Strukturtypen erstellen um sie etwas weniger ausführlich zu erklären.
Eine vollständige Strukturdefinition ist tatsächlich ein Typ in Go, genau wie int
oder []byte
oder string
. So wie Sie es können:
oder:
%Vor%und beide sind verschiedene Typen, die wie Ints aussehen. Sie können dasselbe auch mit Strukturen tun:
%Vor% Der Typname ( NewType
) wurde gerade durch den Typ der Struktur selbst ersetzt, struct{A string}
. Beachten Sie, dass sie nicht den gleichen Typ (einen Alias) zum Zweck des Vergleichs oder der Zuordnung haben, aber sie haben die gleiche Semantik.