Maison > développement back-end > Golang > Comment les interfaces peuvent-elles résoudre le problème de covariance tableau/tranche de Go ?

Comment les interfaces peuvent-elles résoudre le problème de covariance tableau/tranche de Go ?

Susan Sarandon
Libérer: 2024-12-29 10:06:11
original
953 Les gens l'ont consulté

How Can Interfaces Solve Go's Array/Slice Covariance Problem?

Utilisation d'interfaces pour remédier au déficit de covariance tableau/tranche dans Go

Dans Go, le manque de covariance tableau/tranche présente des défis lorsque l'on travaille avec tableaux ou tranches de différents types. Considérez le scénario suivant :

func printItems(header string, items []interface{}, fmtString string) {
  // ...
}

func main() {
  var iarr = []int{1, 2, 3}
  var farr = []float{1.0, 2.0, 3.0}
  printItems("Integer array:", iarr, "")
  printItems("Float array:", farr, "")
}
Copier après la connexion

Ce code tente d'imprimer un tableau d'entiers et un tableau flottant à l'aide d'une fonction générique printItems. Cependant, il rencontre des erreurs de compilation en raison de la restriction de Go sur la covariance de collection.

Solution utilisant des interfaces

Une approche idiomatique pour surmonter cette limitation consiste à utiliser des interfaces. En définissant une interface qui encapsule la taille et l'indexation d'une liste, nous pouvons créer des types qui l'implémentent pour différents types de données :

type List interface {
    At(i int) interface{}
    Len() int
}

type IntList []int
type FloatList []float64

func (il IntList)   At(i int) interface{} { return il[i] }
func (fl FloatList) At(i int) interface{} { return fl[i] }

func (il IntList)   Len() int { return len(il) }
func (fl FloatList) Len() int { return len(fl) }
Copier après la connexion

Utilisation

Avec ces types et l'interface définie, nous pouvons désormais accéder et imprimer de manière générique les arrays :

func printItems(header string, items List) {
    for i := 0; i < items.Len(); i++ {
        fmt.Print(items.At(i), " ")
    }
    fmt.Println()
}

func main() {
    var iarr = []int{1, 2, 3}
    var farr = []float64{1.0, 2.0, 3.0}
    printItems("Integer array:", IntList(iarr))
    printItems("Float array:", FloatList(farr))
}
Copier après la connexion

Conclusion

Bien que les génériques offrent une solution plus élégante, l'utilisation d'interfaces reste une approche robuste pour gérer la covariance de collection dans Go, nous permettant de travailler avec différents types de données de manière générique.

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!

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal