Maison > développement back-end > Golang > Cas d'utilisation particuliers et techniques des génériques dans Golang

Cas d'utilisation particuliers et techniques des génériques dans Golang

王林
Libérer: 2024-05-02 22:48:01
original
829 Les gens l'ont consulté

Cas d'utilisation spéciaux et astuces pour les génériques dans Go Utilisez des interfaces de type vides pour la vérification de type dynamique afin de vérifier les types d'exécution. Utilisez des paramètres de type génériques dans les collections pour créer des conteneurs de divers types. Implémentez des méthodes génériques pour effectuer des opérations courantes pour différents types de paramètres. Utilisez des contraintes de type pour implémenter des génériques spécifiques à un type et personnaliser les opérations pour les types spécifiés.

Cas dutilisation particuliers et techniques des génériques dans Golang

Cas d'utilisation spéciaux et conseils pour les génériques dans Go

Les génériques introduisent de nouvelles fonctionnalités qui permettent d'écrire du code flexible et efficace. Cet article explorera des cas d'utilisation et des techniques spéciales pour les génériques dans Go.

1. Utilisez une interface de type vide pour la vérification de type dynamique

any Le type peut représenter n'importe quel type. Cela nous permet d'effectuer une vérification de type dynamique basée sur les types déterminés au moment de l'exécution.

func isString(v any) bool {
    _, ok := v.(string)
    return ok
}

func main() {
    x := "hello"
    y := 10
    fmt.Println(isString(x)) // true
    fmt.Println(isString(y)) // false
}
Copier après la connexion

2. Utilisation de types génériques sur les collections

Les paramètres de type génériques peuvent être utilisés dans les types de collection pour créer un conteneur de divers types.

type Stack[T any] []T

func (s *Stack[T]) Push(v T) {
    *s = append(*s, v)
}

func (s *Stack[T]) Pop() T {
    if s.IsEmpty() {
        panic("stack is empty")
    }

    v := (*s)[len(*s)-1]
    *s = (*s)[:len(*s)-1]
    return v
}

func main() {
    s := new(Stack[int])
    s.Push(10)
    s.Push(20)
    fmt.Println(s.Pop()) // 20
    fmt.Println(s.Pop()) // 10
}
Copier après la connexion

3. Implémenter des méthodes génériques

Les méthodes génériques nous permettent d'implémenter des opérations communes pour différents types de paramètres.

type Num[T numeric] struct {
    V T
}

func (n *Num[T]) Add(other *Num[T]) {
    n.V += other.V
}

func main() {
    n1 := Num[int]{V: 10}
    n2 := Num[int]{V: 20}
    n1.Add(&n2)
    fmt.Println(n1.V) // 30

    // 可以使用其他数字类型
    n3 := Num[float64]{V: 3.14}
    n4 := Num[float64]{V: 2.71}
    n3.Add(&n4)
    fmt.Println(n3.V) // 5.85
}
Copier après la connexion

4. Implémentez des génériques spécifiques à un type à l'aide de contraintes de type

Les contraintes de type limitent la portée des types génériques. Cela nous permet d'implémenter des opérations personnalisées pour des types spécifiques.

type Comparer[T comparable] interface {
    CompareTo(T) int
}

type IntComparer struct {
    V int
}

func (c *IntComparer) CompareTo(other IntComparer) int {
    return c.V - other.V
}

// IntSlice 实现 Comparer[IntComparer] 接口
type IntSlice []IntComparer

func (s IntSlice) Len() int {
    return len(s)
}

func (s IntSlice) Less(i, j int) bool {
    return s[i].CompareTo(s[j]) < 0
}

func (s IntSlice) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}

func main() {
    s := IntSlice{{10}, {20}, {5}}
    sort.Sort(s)
    fmt.Println(s) // [{5} {10} {20}]
}
Copier après la connexion

Ces cas d'utilisation et techniques spéciaux démontrent la puissance des génériques dans Go, permettant la création d'un code plus polyvalent, flexible et efficace.

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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal