Table des matières
✅ 2. Fonctions génériques: avec des contraintes de type (contrainte)
✅ 3. Structure générique
✅ 4. Méthodes génériques
✅ 5. GÉNÉRIQUES ET MAP: Trouvez des valeurs clés
✅ 6. Scénarios d'application pratiques: cache général
Résumé: points clés des génériques
Maison développement back-end Golang Passez par l'exemple des génériques

Passez par l'exemple des génériques

Jul 29, 2025 am 04:10 AM
java programmation

Les génériques GO sont pris en charge depuis 1.18 et sont utilisés pour écrire du code générique pour le type de type. 1. La fonction générique imprimslice [t any] (s [] t) peut imprimer des tranches de tout type, telles que [] int ou [] chaîne. 2. Grâce au nombre de contraintes de type, les limites des types numériques tels que INT et Float, implémentez SUM [Number] (Slice [] T) T Sommation sûre. 3. Box de type de structure générique [t any] struct {valeur t} peut encapsuler n'importe quelle valeur de type et être utilisé avec le constructeur newbox [t any] (v t) * Box [t]. 4. Ajouter des méthodes set (v t) et get () t pour boxer [t], sans déclarer à plusieurs reprises [t] dans la méthode. 5. Fonction de paramètre multi-type contient la valeur [k comparable, v any] (m map [k] v, valeur v) bool détermine s'il y a une certaine valeur dans la carte et k doit être comparée. 6. Applications pratiques telles que le cache de type cache général [k comparable, v any] struct {data map [k] v}, fournissant des opérations et obtenez des opérations pour implémenter le stockage de valeurs de clé de type type. Les génériques améliorent la réutilisabilité du code et la sécurité par le biais de paramètres de type, de contraintes et de types d'union, et la syntaxe est concise et pratique.

Passez par l'exemple des génériques

Les génériques pour GO ont été officiellement pris en charge depuis GO 1.18, ce qui vous permet d'écrire des fonctions et des structures de données communes qui peuvent gérer plusieurs types. Voici plusieurs exemples génériques GO typiques pour vous aider à comprendre rapidement comment utiliser les génériques dans la pratique.

Passez par l'exemple des génériques

✅ 1. Fonction générique: PrintSlice[T any]

Si vous souhaitez imprimer n'importe quel type de contenu Slice, tel que []int et []string , vous pouvez écrire une fonction générique:

 func impriméslice [t any] (s [] t) {
    pour _, v: = range s {
        fmt.print (v, "")
    }
    fmt.println ()
}

// Utilisez l'exemple imprimés ([] int {1, 2, 3}) // sortie: 1 2 3
PRINTSLICE ([] String {"A", "B"}) // OUTPUT: AB
  • [T any] signifie que le paramètre de type T peut être de n'importe quel type.
  • any est un alias pour interface{} , n'informant aucune contrainte.

✅ 2. Fonctions génériques: avec des contraintes de type (contrainte)

Si vous souhaitez restreindre les types, tels que seuls les types numériques sont autorisés, vous pouvez définir les contraintes:

Passez par l'exemple des génériques
 Type d'interface numéro {
    int | INT32 | INT64 | float32 | float64
}

func sum [t numéro] (tranche [] t) t {
    var total t
    pour _, v: = range tranche {
        Total = V
    }
    Retour total
}

// utilise fmt.println (sum ([] int {1, 2, 3})) // 6
fmt.println (sum ([] float64 {1.1, 2.2})) // 3.3
  • Number est un type d'interface, qui utilise | pour représenter le type syndical (syndicat), et la limite T doit être l'un des types énumérés.
  • Cela vous empêche de passer string ou struct , etc. Type de fonctionnement.

✅ 3. Structure générique

Définissez un conteneur Box commun qui peut contenir tout type de valeur:

 Type Box [t any] struct {
    Valeur t
}

func newbox [t any] (v t) * box [t] {
    return & box [t] {valeur: v}
}

// Utilisez INTBOX: = NewBox (42)
strBox: = newbox ("bonjour")

fmt.println (intbox.value) // 42
fmt.println (strbox.value) // Bonjour
  • Box[T] est une structure générique.
  • NewBox est un constructeur générique qui déduit automatiquement les types.

✅ 4. Méthodes génériques

Ajouter des méthodes aux structures génériques:

Passez par l'exemple des génériques
 func (b * box [t]) set (v t) {
    B.Value = V
}

func (b * box [t]) get () t {
    retour b.value
}

// Utilisez la boîte: = Newbox (100)
Box.Set (200)
fmt.println (box.get ()) // 200

La méthode elle-même n'a pas besoin de déclarer [T] car elle appartient déjà Box[T] .


✅ 5. GÉNÉRIQUES ET MAP: Trouvez des valeurs clés

Écrivez une fonction générale pour trouver si une valeur existe sur la carte:

 func contientValue [k comparable, v any] (m map [k] v, valeur v) bool {
    pour _, v: = range m {
        Si v == valeur {
            Retour vrai
        }
    }
    retourner faux
}

// utilise m: = map [string] int {"a": 1, "b": 2}
fmt.println (contientValue (m, 2)) // true
fmt.println (contientValue (m, 3)) // false
  • K comparable : le type de clé doit être comparable (comme la chaîne, l'int, la structure, etc.).
  • V any : la valeur peut être de n'importe quel type.
  • Les paramètres de type multiple sont séparés par des virgules.

✅ 6. Scénarios d'application pratiques: cache général

Vous pouvez implémenter une structure de cache simple à l'aide de génériques:

 type cache [k comparable, v any] struct {
    Carte de données [K] V
}

func newcache [k comparable, v any] () * cache [k, v] {
    return & cache [k, v] {
        Données: faire (map [k] v),
    }
}

func (c * cache [k, v]) set (key k, valeur v) {
    c.data [clé] = valeur
}

func (c * cache [k, v]) get (key k) (v, bool) {
    v, ok: = c.data [clé]
    Retour V, ok
}

utiliser:

 cache: = newCache [String, int] ()
cache.set ("utilisateurs", 100)
Si val, ok: = cache.get ("utilisateurs"); d'accord {
    fmt.println ("Count:", Val)
}

Résumé: points clés des génériques

  • Utilisez [T any] ou [T Constraint] pour définir les paramètres de type.
  • comparable est une contrainte prédéfinie pour les types comparables (pour la clé de carte, == jugement, etc.).
  • Les types d'union ( | ) peuvent restreindre les collections de types.
  • Les génériques rendent les fonctions et les structures plus générales, de type type et réduisent le code en double.

Fondamentalement, c'est tout. Les génériques ne poursuivent pas la complexité, mais ne mettent pas l'accent sur le praticité et la clarté. Lorsque vous l'utilisez pour la première fois, vous sentirez que la grammaire est un peu nouvelle, mais après avoir écrit quelques exemples, vous vous sentirez assez naturel.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Porce de variable PHP expliquée
1 Il y a quelques mois By 百草
Conseils pour écrire des commentaires PHP
4 Il y a quelques semaines By 百草
Commentant le code en php
4 Il y a quelques semaines By 百草
<🎜>: Grow A Garden - Guide complet des marchands itinérants
3 Il y a quelques semaines By Jack chen

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1510
276
Comment implémenter un client TCP simple en Java? Comment implémenter un client TCP simple en Java? Aug 08, 2025 pm 03:56 PM

Importjava.ioandjava.net.socketfori / oandsocketcommunication.2.CreateasockingObjectToConnectTotheServerusingHostNAMEAndport.3.USEPRINTWRERTOSENDDATAVIATPUTSTREMANDBUFFERDREDERTOREADSERVERSPONSESESES

Correction: la mise à jour Windows n'a pas réussi à installer Correction: la mise à jour Windows n'a pas réussi à installer Aug 08, 2025 pm 04:16 PM

RunThewindowsUpDateTroulesshooTervAyingSettings> Update & Security> TroubleshoottoAutomAticyFixComMonissues.2.ResetwindowsupDateComponentsBystoppingrelatedServices, RenamingtheSoftwaredSistributeandCatroot2folders, TherestartingTheServicestoClelele

Quel est le processus de sérialisation pour un objet Java? Quel est le processus de sérialisation pour un objet Java? Aug 08, 2025 pm 04:03 PM

JavaserializationConvertsanObject'sStateIntoabyTereamForSorageorTransmission, etdesializationreconstructStheObjectfromThatStream.1.ToEnableSerialization, aclassmustimplementTheSerizable Interface.2.UseObjectOutStreamToserialiseanobject, Savin

Comment utiliser une boucle de temps en Java Comment utiliser une boucle de temps en Java Aug 08, 2025 pm 04:04 PM

AwhileloopinjavarePeatlyExECUtesCodeaslongAstheConditioniStrue; 2.InitialiseAntrolvariableBeforeTheroop; 3.DefeTheLoopConditionususingAboolEanExpression; 4.UpdateTheControlvariableSideThelopToPrevevenInIniteLooping; 5.USEEXMELLESLILESLINIDINGNUNTINGNUMBUR

Qu'est-ce qu'un hashmap à Java? Qu'est-ce qu'un hashmap à Java? Aug 11, 2025 pm 07:24 PM

AhashmapinjavaisadatastructureThatStoreskey-ValuepraireForeFICETTREVAL, insertion etdeletion.itUshesthekey’shashcode () methodtodeterMinestorageLocationandallowsAtEptoro (1) timeComplexityforget () andput () opérations.

Comment créer et utiliser un tableau en java Comment créer et utiliser un tableau en java Aug 11, 2025 pm 04:00 PM

TOCREATANDUSEAnArrayinjava, FirstdeclatethearraywithThedatatypeAndSquarebrackets, ThenstantiateitwithThenewKeywordOralitializeTirectlywithValues; 1.DeclareAndedCreateArrayusingDataty

Comment créez-vous un fil en Java? Comment créez-vous un fil en Java? Aug 11, 2025 pm 01:34 PM

YoucancreatEatheadInjavabyExtentenstenstheredClassorimpelementingTherUnableInterface.2.ExtendingThreadInvolvesCreatAclassHatoverrideStherun () MethodandCallingStart () onaninstance.3.ImplementsrunnableRequireSdefiningTherun () Methodinaclasse.30

Python Argparse exigence de l'argument requis Python Argparse exigence de l'argument requis Aug 11, 2025 pm 09:42 PM

Lorsque vous utilisez le module ArgParse, les paramètres qui doivent être fournis peuvent être obtenus en réglant le réglage = TRUE. 1. Utiliser requis = TRUE pour définir des paramètres facultatifs (tels que --inter) à être requis. S'il n'est pas fourni lors de l'exécution du script, une erreur sera signalée; 2. Les paramètres de position sont requis par défaut, et il n'est pas nécessaire de définir requis = true; 3. Il est recommandé d'utiliser les paramètres de position pour les paramètres nécessaires. Parfois, les paramètres facultatifs de requis = TRUE sont utilisés pour maintenir la flexibilité; 4. Required = true est le moyen le plus direct de contrôler les paramètres. Après utilisation, l'utilisateur doit fournir des paramètres correspondants lors de l'appel du script, sinon le programme invitera une erreur et quittera.

See all articles