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
Susan Sarandonoriginal
2024-12-29 10:06:11982parcourir

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, "")
}

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) }

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))
}

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!

Déclaration:
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