Maison > développement back-end > Golang > Génériques : contraintes et structures intégrées dans les interfaces

Génériques : contraintes et structures intégrées dans les interfaces

王林
Libérer: 2024-02-08 23:21:19
avant
612 Les gens l'ont consulté

Génériques : contraintes et structures intégrées dans les interfaces

l'éditeur php Xiaoxin vous propose une introduction aux génériques. Les génériques sont des contraintes et des structures intégrées dans des interfaces qui nous permettent d'être plus flexibles et efficaces lors de l'écriture de code. En utilisant des génériques, nous pouvons trouver et résoudre les erreurs de type au moment de la compilation, améliorant ainsi la lisibilité et la maintenabilité du code. Les génériques peuvent également nous aider à concevoir des structures de données et des algorithmes plus généraux, améliorant ainsi la réutilisabilité du code. Dans cet article, nous approfondirons les concepts, l'utilisation et les applications pratiques des génériques pour vous aider à mieux comprendre et appliquer la programmation générique.

Contenu du problème

Le code suivant ne peut pas être compilé et signalé ./main.go:35:7: test does not meet constraint (test missing in main.structwithname)

package main

import "fmt"

type Test struct {
    Name string
}

func (t Test) String() string {
    return fmt.Sprintf("Name: %v", t.Name)
}

type StructWithName struct {
    Name string
}

type Constraint interface {
    StructWithName
    // ~struct {
    //  Name string
    // }
    String() string
}

func Print[T Constraint](x T) {
    //s := T{}
    fmt.Printf("Hello %v", x)
}

func main() {
    t := Test{
        Name: "Test",
    }

    Print(t)
}
Copier après la connexion

Cependant, si je commente le structwithname et décommente le bloc ~struct, alors il se compile correctement. Je ne comprends pas la différence sémantique entre les deux.

Ce que j'essaie de faire, c'est d'avoir une méthode générique qui peut gérer une structure de manière générique, c'est-à-dire x := s{} puis de la transmettre à une bibliothèque externe ; Dans ce cas, c'est pour le fournisseur Terraform, le code dans les ressources est très similaire, je suis un peu gêné par la quantité de duplication que je vois dans les fournisseurs existants, dans mon cas les ressources sont très similaires, certaines se situent entre les deux ; structures par défaut (il n'y a qu'un ou deux champs dessus). J'aimerais pouvoir écrire un ensemble de méthodes génériques qui font toutes des choses similaires, et n'ont que les spécificités ailleurs (duh !).

Je n'en suis encore qu'aux premiers stades de mon parcours Go et je n'arrive pas à comprendre les erreurs du compilateur.

Solution

Si je comprends bien, ce que vous voulez vraiment n'est pas possible. Les génériques Go ne prennent pas en charge l’accès à un sous-ensemble de champs de structure.

En ce qui concerne les bugs impliqués...

Le nom d'un type

spécifie l'identité du type, et deux types avec des noms différents (pas d'alias l'un pour l'autre) sont toujours différents, donc test et teststructwithname sont deux types différents. La seule chose qu'ils ont en commun est leur type sous-jacent.

type constraint interface { structwithname } Une interface est un ensemble de types qui contient un seul type, qui est type constraint 接口 { structwithname } 接口是一个仅包含一种类型的类型集,即 structwithname,并且由于 test 不是该类型集的成员,这意味着不可能使用 test, et comme test n'est pas membre de cet ensemble de types, ceci signifie qu'aucun type test ne peut être utilisé pour satisfaire cette contrainte.

type struct { name string } 是一个无名类型,任何无名类型的底层类型都是该类型本身,即 struct 的底层类型 { name string } is struct { name string } est un type sans nom, et le type sous-jacent de tout type sans nom est le type lui-même, c'est-à-dire le type sous-jacent de struct { name string }

is

~t,表示任何类型,其底层类型t.

Le tilde devant le type dans la contrainte, c'est-à-dire ~t, représente

tout

type dont le

type sous-jacent

est le même que t. Ou, plus précisément, struct { name string } L'ensemble de types d'un élément de la forme

~t est l'ensemble de tous les types dont le type de base est t. 🎜 🎜Alors quand tu le fais 🎜
type Constraint interface { ~struct { Name string } }
Copier après la connexion
🎜Ensuite, l'ensemble de types contraints contiendra tout type qui a 🎜 comme type de base. 🎜

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:stackoverflow.com
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