Maison >développement back-end >Golang >Comment pouvons-nous gérer efficacement les limitations de covariance tableau/tranche de Go ?

Comment pouvons-nous gérer efficacement les limitations de covariance tableau/tranche de Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-14 21:32:15288parcourir

How Can We Efficiently Handle Go's Array/Slice Covariance Limitations?

Résoudre les limites de la covariance tableau/tranche dans Go : une approche ingénieuse

Le manque de covariance tableau/tranche de Go peut poser des défis lorsqu'il s'agit de données hétérogènes collections. Considérez la situation suivante :

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

Malheureusement, ce code échouera avec des erreurs de compilation en raison du système de typage strict de Go :

prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument      
prog.go:27: cannot use farr (type []float) as type []interface { } in function argument

Une solution sophistiquée : adopter les interfaces

Une façon élégante de surmonter cette limitation consiste à tirer parti du puissant système d'interface de Go. En définissant une interface qui encapsule les propriétés essentielles d'une collection de type tableau, nous pouvons créer une solution générique :

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

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

Implémentations spécifiques au type

Pour chaque de type concret, nous implémentons l'interface List :

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

Exemple Utilisation

Pour utiliser notre code générique, nous encapsulons les tableaux concrets dans nos types personnalisés :

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

Cette approche nous permet de manipuler des collections hétérogènes de manière générique, en contournant élégamment Go manque de covariance tableau/tranche tout en adhérant à ses principes de sécurité de type idiomatique.

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