Gehen Sie mit Beispielgenerika
Go Generics werden seit 1.18 unterstützt und zum Schreiben von generischen Code für Typ-Safe verwendet. 1. Die generische Funktion printslice [t beliebig] (s [] t) kann Scheiben jeglicher Art drucken, z. B. [] int oder [] String. 2. Implementieren Sie durch Typ -Einschränkungsnummer t auf numerische Typen wie int und float summe [t -Nummer] (Slice [] t) T Safe Summation. A. Generisches Struktur -Typ Box [t jeder] struktur {value t} kann jeden Typ -Wert zusammenfassen und mit der NewBox [T] (V T) *Box [t] Constructor verwendet werden. 4. Set (v t) hinzufügen und () m Methoden zum Boxen [t] erhalten, ohne wiederholt [t] in die Methode zu deklarieren. 5. Die Parameterfunktion des Multi-Typs enthält einen Wert [k vergleichbar, v jeder] (M-Karte [k] v, Wert v) BOOL bestimmt, ob in der Karte ein bestimmter Wert vorhanden ist und K verglichen werden muss. 6. Praktische Anwendungen wie der allgemeine Cache-Cache [k vergleichbar, v jeder] struktur {data map [k] v}, die SET- und Erhalten von Vorgängen zum Implementieren von Typ-Safe-Schlüsselwertspeichern für den Typ. Generika verbessern die Wiederverwendbarkeit und Sicherheit von Code durch Typparameter, Einschränkungen und Gewerkschaftstypen, und die Syntax ist prägnant und praktisch.
Generika für GO wurden seit Go 1.18 offiziell unterstützt, sodass Sie gemeinsame Funktionen und Datenstrukturen schreiben können, die mehrere Typen verarbeiten können. Das Folgende sind einige typische generische Beispiele , mit denen Sie schnell verstehen können, wie Generika in der Praxis verwendet werden.

✅ 1. Generische Funktion: PrintSlice[T any]
Wenn Sie einen Slice -Inhalt drucken möchten, wie z. B. []int
und []string
, können Sie eine generische Funktion schreiben:
func printslice [t irgendwelche] (s [] t) { Für _, v: = Bereich S { fmt.print (v, "") } fmt.println () } // Beispiel für Printslice ([] int {1, 2, 3}) // Ausgabe: 1 2 3 Printslice ([] String {"a", "b"}) // Ausgabe: AB
-
[T any]
bedeutet, dass der TypparameterT
von jedem Typ sein kann. -
any
ist ein Alias fürinterface{}
, die keine Einschränkungen anzeigt.
✅ 2. Generische Funktionen: Mit Typ -Einschränkungen (Einschränkung)
Wenn Sie Typen einschränken möchten, z. B. nur numerische Typen sind zulässig, können Sie Einschränkungen definieren:

Typ number -Schnittstelle { int | int32 | int64 | float32 | float64 } func sum [t nummer] (Slice [] t) t { var total t Für _, v: = Bereich Slice { Gesamt = v } Return Total } // Verwenden Sie fmt.println (sum ([] int {1, 2, 3}) // 6 fmt.println (sum ([] float64 {1.1, 2.2}) // 3.3
-
Number
ist ein Schnittstellentyp, der|
verwendet Um Gewerkschaftstyp (Union) zu vertreten, und LimitT
muss einer der aufgelisteten Typen sein. - Dies verhindert, dass Sie
string
oderstruct
usw. nicht unterstützen
✅ 3. Generisches Struktur
Definieren Sie einen gemeinsamen Box
, der jede Art von Wert aufnehmen kann:
Geben Sie das Box [t Any] struct {ein Wert t } func NewBox [t irgendein] (v t) *Box [t] { return & box [t] {value: v} } // Intbox: = NewBox (42) verwenden strbox: = newbox ("Hallo") fmt.println (intbox.value) // 42 fmt.println (strbox.value) // Hallo
-
Box[T]
ist eine generische Struktur. -
NewBox
ist ein generischer Konstruktor, der die Typen automatisch abzieht.
✅ 4. Generische Methoden
Fügen Sie Methoden zu generischen Strukturen hinzu:

func (b *box [t]) set (v t) { B. value = v } func (b *box [t]) get () t { Rückkehr B. value } // Box verwenden: = newbox (100) Box.set (200) fmt.println (box.get ()) // 200
Die Methode selbst muss [T]
nicht deklarieren, da sie bereits zum Box[T]
-Typ gehört.
✅ 5. Generika und Karte: Finden Sie Schlüsselwerte
Schreiben Sie eine allgemeine Funktion, um zu finden, ob in der Karte ein Wert vorhanden ist:
func enthält sValue [k vergleichbar, v beliebig] (m map [k] v, value v) bool { für _, v: = Bereich m { Wenn v == Wert { RECHT WAHR } } Return falsch } // Verwenden Sie m: = map [string] int {"a": 1, "b": 2} fmt.println (enthältValue (m, 2)) // true fmt.println (enthält value (m, 3)) // false
-
K comparable
: Der Schlüsseltyp muss vergleichbar sein (z. B. Zeichenfolge, int, struktur usw.). -
V any
: Der Wert kann von jedem Typ sein. - Mehrere Typparameter werden durch Kommas getrennt.
✅ 6. Praktische Anwendungsszenarien: Allgemeiner Cache
Sie können eine einfache Cache -Struktur mit Generika implementieren:
Geben Sie Cache [k vergleichbar, v jeder] struktur { Datenkarte [k] v } Func Newcache [K vergleichbar, v irgendwelche] () *Cache [k, v] { return & cache [k, v] { Daten: make (map [k] v), } } func (c *cache [k, v]) set (key k, value v) { C.Data [Schlüssel] = Wert } func (c *cache [k, v]) get (key k) (v, bool) { V, OK: = C.Data [Schlüssel] Rückkehr v, ok }
verwenden:
Cache: = newcache [String, int] () Cache.set ("Benutzer", 100) If Val, OK: = cache.get ("Benutzer"); OK { fmt.println ("count:", val) }
Zusammenfassung: Schlüsselpunkte der Generika
- Verwenden Sie
[T any]
oder[T Constraint]
um Typparameter zu definieren. -
comparable
ist eine vordefinierte Einschränkung für vergleichbare Typen (für Kartenschlüssel, == Urteil usw.). - Gewerkschaftstypen (
|
) können Typensammlungen einschränken. - Generika machen Funktionen und Strukturen allgemeiner, Typ-sicherer und reduzieren den doppelten Code.
Grundsätzlich ist das. Go Generics verfolgen keine Komplexität, sondern betonen die Praktikabilität und Klarheit. Wenn Sie es zum ersten Mal verwenden, werden Sie das Gefühl haben, dass die Grammatik etwas neu ist, aber nachdem Sie ein paar Beispiele geschrieben haben, werden Sie sich ganz natürlich fühlen.
Das obige ist der detaillierte Inhalt vonGehen Sie mit Beispielgenerika. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

AdeadlockinjavaoccurswhentwoOmorethreadsareblockedforever, jeder waitingForAresourceheldyTheOther, typischerweiseDuetoccircularWait -byConsistentLockorder;
![Sie verwenden derzeit keine an eine NVIDIA GPU angehängte Anzeige [behoben].](https://img.php.cn/upload/article/001/431/639/175553352135306.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
Ifyousee "youarenotusingAdisplayAttachedToannvidiagpu", sorgthyourMonitorisconnectedTotenvidiagpuport, configuredisplaysetingsinnvidiaControlpanel, aktualisiertesRiversusingdduandcleanInstall und SetthePrimarygputodiscretetIniNBiScreteInbios/uefi.restartafartafartafarfArtartafarfaTafarygputodiscreteInbios/uefi

Useoptional.empty (), optional.of (), andoptional.ofnulle () tocreateoptionalinStancesDendonwhenthevalueisabsinent, nicht null, orpossiblesiblesible.2.CheckForvaluessafelyusingiSent () -Preferactifrisiflyteflythithortefleftwishthorteflecthors.

Micronautissidealforbuildingcloud-nativjavaapplicationsduetoitslowMemoryfootprint, Faststartuptimes und Compile-TimedependencyInjection, Making-SuperiortotraditionalframeWorkslikespringbootformicros-Service, Contentotrost und serverlessAnlenneVironment.1.Microna

Verstehen Sie JCA -Kernkomponenten wie MessagedIGest, Chiffre, Keygenerator, Securerandom, Signature, Keystore usw., die Algorithmen über den Anbietermechanismus implementieren. 2. Verwenden Sie starke Algorithmen und Parameter wie SHA-256/SHA-512, AES (256-Bit-Schlüssel, GCM-Modus), RSA (2048-Bit oder höher) und Securerandom; 3. Vermeiden Sie hartcodierte Schlüssel, verwenden Sie Keystore, um Schlüssel zu verwalten und Tasten über sichere abgeleitete Passwörter wie PBKDF2 zu generieren. 4. Deaktivieren

Der Kern von Springdatajpa und Hibernate, die zusammenarbeiten, lautet: 1. JPA ist die Spezifikation und der Winterschlaf ist die Implementierung, die Springdatajpa -Kapselung vereinfacht die DAO -Entwicklung. 2. Entity -Klassen karten Datenbankstrukturen über @entity, @ID, @Column usw.; 3.. Die Repository -Schnittstelle erbt JParepository, um CRUD und benannte Abfragemethoden automatisch zu implementieren. 4. Komplexe Abfragen verwenden @Query Annotation, um JPQL oder native SQL zu unterstützen. 5. Im Springboot wird die Integration durch Hinzufügen von Starterabhängigkeiten und Konfigurieren von Datenquellen und JPA -Attributen abgeschlossen. 6. Transaktionen werden von @transactiona durchgeführt

RuntheApplicationOrcommandasAdministratorbyright-ClickingandSelecting "Runasadministrator" TensureElevatedPrivileGeSareGrant.2.CheckuserAccountControl (UAC) EinstellungensbysearchingForuacinThestartMenuandttheSlidtothEDEDEDEDEDEDEDEDEDEFAULTLEVELLE (Secondfr

Die Musterklasse wird verwendet, um reguläre Ausdrücke zu kompilieren, und in der Matcher -Klasse werden übereinstimmende Vorgänge für Zeichenfolgen durchgeführt. Die Kombination der beiden kann die Textsuche, die Übereinstimmung und den Austausch von Text realisieren. Erstellen Sie zuerst ein Musterobjekt über muster.comPile () und rufen Sie dann seine Matcher () -Methode auf, um eine Matcher -Instanz zu generieren. Verwenden Sie dann Matches (), um die vollständige String -Matching zu beurteilen, zu finden (), um Subsequenzen zu finden, zu ersetzen () oder ersetzen Sie essFirst () für den Austausch. Wenn der reguläre Fall eine Erfassungsgruppe enthält, kann der N -te Gruppeninhalt über die Gruppe (N) erhalten werden. In den tatsächlichen Anwendungen sollten Sie wiederholte Kompilierungsmuster vermeiden, auf spezielle Charakter -Escapes achten und das Matching -Muster -Flag nach Bedarf verwenden und letztendlich effizient erreichen
